Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
clase:iabd:pia:2eval:tema10 [2025/01/05 19:17] admin [Ejemplo] |
clase:iabd:pia:2eval:tema10 [2025/01/06 11:22] (actual) admin [Ejemplo] |
||
---|---|---|---|
Línea 53: | Línea 53: | ||
===== Ejemplo ===== | ===== Ejemplo ===== | ||
+ | Vamos a hacer una red neuronal que dado 24 temperatura (una por cada hora) obtener la temperatura que hará 12 horas despues. | ||
Línea 85: | Línea 85: | ||
</ | </ | ||
+ | {{: | ||
+ | |||
+ | * Ahora los transformamos en la estructura que quiere Keras que es una matriz para cada dato. Fijarse que la '' | ||
+ | |||
+ | |||
+ | <sxh python> | ||
+ | |||
+ | |||
+ | def get_datos(serie_datos, | ||
+ | size=len(serie_datos) | ||
+ | |||
+ | |||
+ | |||
+ | x=[] | ||
+ | y=[] | ||
+ | for i in range(size-tamanyo_ventana-adelanto_prediccion): | ||
+ | x.append(serie_datos[i: | ||
+ | y.append(serie_datos[i+tamanyo_ventana+adelanto_prediccion]) | ||
+ | |||
+ | | ||
+ | |||
+ | x=np.array(x) | ||
+ | y=np.array(y) | ||
+ | |||
+ | |||
+ | |||
+ | size_entrenamiento=math.floor(x.shape[0]*0.8) | ||
+ | |||
+ | x_entrenamiento=x[0: | ||
+ | x_validacion=x[size_entrenamiento: | ||
+ | y_entrenamiento=y[0: | ||
+ | y_validacion=y[size_entrenamiento: | ||
+ | |||
+ | |||
+ | return x_entrenamiento.reshape(-1, | ||
+ | |||
+ | |||
+ | scaler = MinMaxScaler() | ||
+ | temperaturas_scaled = scaler.fit_transform(temperaturas.reshape(-1, | ||
+ | x_entrenamiento, | ||
+ | |||
+ | </ | ||
+ | |||
+ | En nuestro ejemplo lo que hemos hecho es que para cada 24 temperaturas ('' | ||
+ | Tambien hemos escalado los datos, lo cual es importante para que la red funcione mejor. Por último fíjate que tanto la '' | ||
+ | |||
+ | * Ahora vamos a crear la red y entrenarla | ||
+ | |||
+ | <sxh python> | ||
+ | def get_model(shape): | ||
+ | model=Sequential() | ||
+ | model.add(Input(shape=shape)) | ||
+ | model.add(GRU(24, | ||
+ | model.add(Dropout(0.1)) | ||
+ | model.add(GRU(50, | ||
+ | model.add(Dropout(0.1)) | ||
+ | model.add(GRU(24, | ||
+ | model.add(Dropout(0.1)) | ||
+ | model.add(Dense(1, | ||
+ | model.compile(loss=' | ||
+ | |||
+ | return model | ||
+ | |||
+ | def fit(model, | ||
+ | history=model.fit(x_entrenamiento, | ||
+ | |||
+ | return history | ||
+ | |||
+ | model=get_model(shape=x_entrenamiento.shape[1: | ||
+ | history=fit(model, | ||
+ | </ | ||
+ | Fijarse que en las capas '' | ||
+ | |||
+ | |||
+ | * Vamos a mostrar la gráfica de la pérdida en cada época | ||
+ | |||
+ | <sxh python> | ||
+ | figure=plt.figure(figsize=(6, | ||
+ | axes = figure.add_subplot(1, | ||
+ | axes.plot(history.history[' | ||
+ | axes.plot(history.history[' | ||
+ | axes_configure_labels(axes," | ||
+ | </ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | * Para acabar vamos a mostrar 4 gráficos en la que se va a sobreponer los datos verdaderos y los predichos, tanto en entrenamiento como en validación. | ||
+ | |||
+ | <sxh python> | ||
+ | |||
+ | |||
+ | y_pred_entrenamiento=model.predict(x_entrenamiento) | ||
+ | y_entrenamiento_inverse_transform=scaler.inverse_transform(y_entrenamiento) | ||
+ | y_pred_entrenamiento_inverse_transform=scaler.inverse_transform(y_pred_entrenamiento) | ||
+ | |||
+ | |||
+ | |||
+ | y_pred_validacion=model.predict(x_validacion) | ||
+ | y_validacion_inverse_transform=scaler.inverse_transform(y_validacion) | ||
+ | y_pred_validacion_inverse_transform=scaler.inverse_transform(y_pred_validacion) | ||
+ | |||
+ | |||
+ | figure=plt.figure(figsize=(20, | ||
+ | |||
+ | |||
+ | axes = figure.add_subplot(4, | ||
+ | axes.plot(y_entrenamiento_inverse_transform, | ||
+ | axes.plot(y_pred_entrenamiento_inverse_transform, | ||
+ | axes_configure_labels(axes," | ||
+ | axes.set_xlim(xmin=0, | ||
+ | axes.set_ylim(ymin=-6, | ||
+ | |||
+ | axes = figure.add_subplot(4, | ||
+ | axes.plot(y_validacion_inverse_transform, | ||
+ | axes.plot(y_pred_validacion_inverse_transform, | ||
+ | axes_configure_labels(axes," | ||
+ | axes.set_xlim(xmin=0, | ||
+ | axes.set_ylim(ymin=-6, | ||
+ | |||
+ | |||
+ | axes = figure.add_subplot(4, | ||
+ | axes.plot(y_entrenamiento_inverse_transform, | ||
+ | axes.plot(y_pred_entrenamiento_inverse_transform, | ||
+ | axes_configure_labels(axes," | ||
+ | axes.set_xlim(xmin=y_entrenamiento_inverse_transform.shape[0]-500, | ||
+ | axes.set_ylim(ymin=-6, | ||
+ | |||
+ | axes = figure.add_subplot(4, | ||
+ | axes.plot(y_validacion_inverse_transform, | ||
+ | axes.plot(y_pred_validacion_inverse_transform, | ||
+ | axes_configure_labels(axes," | ||
+ | axes.set_xlim(xmin=y_validacion_inverse_transform.shape[0]-500, | ||
+ | axes.set_ylim(ymin=-6, | ||
+ | </ | ||
- | * Ahora los transformamos en la estructura que quiere Keras que es una matriz para cada dato. | + | {{: |