Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema10

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

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:
 </sxh> </sxh>
  
 +{{:clase:iabd:pia:2eval:ejemplo1_gru_datos_originales.png|}}
 +
 +  * Ahora los transformamos en la estructura que quiere Keras que es una matriz para cada dato. Fijarse que la ''y'' también es una matriz.
 +
 +
 +<sxh python>
 +
 +
 +def get_datos(serie_datos,tamanyo_ventana=24,adelanto_prediccion=12):
 +    size=len(serie_datos)
 +
 +
 +
 +    x=[]
 +    y=[]
 +    for i in range(size-tamanyo_ventana-adelanto_prediccion):
 +        x.append(serie_datos[i:i+tamanyo_ventana])
 +        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:size_entrenamiento]
 +    x_validacion=x[size_entrenamiento:]
 +    y_entrenamiento=y[0:size_entrenamiento]
 +    y_validacion=y[size_entrenamiento:]
 +
 +
 +    return x_entrenamiento.reshape(-1,tamanyo_ventana,1), y_entrenamiento.reshape(-1,1), x_validacion.reshape(-1,tamanyo_ventana,1), y_validacion.reshape(-1,1)
 +
 +
 +scaler = MinMaxScaler()
 +temperaturas_scaled = scaler.fit_transform(temperaturas.reshape(-1,1)).reshape(temperaturas.shape)
 +x_entrenamiento, y_entrenamiento, x_validacion, y_validacion=get_datos(temperaturas_scaled,tamanyo_ventana=24,adelanto_prediccion=12)
 +
 +</sxh>
 +
 +En nuestro ejemplo lo que hemos hecho es que para cada 24 temperaturas (''tamanyo_ventana=24'') , obtener la temperatura que habrá 12 horas después (''adelanto_prediccion=12'').
 +Tambien hemos escalado los datos, lo cual es importante para que la red funcione mejor. Por último fíjate que tanto la ''x'' como la ''y'' son matrices ''x_entrenamiento.reshape(-1,tamanyo_ventana,1)'' y ''y_entrenamiento.reshape(-1,1)''
 +
 +  * 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, activation='swish', return_sequences=True))
 +    model.add(Dropout(0.1))       
 +    model.add(GRU(50, activation='swish', return_sequences=True ))
 +    model.add(Dropout(0.1))  
 +    model.add(GRU(24, activation='swish', return_sequences=False))
 +    model.add(Dropout(0.1))    
 +    model.add(Dense(1, activation='linear'))
 +    model.compile(loss='mean_squared_error',optimizer="adam")
 +
 +    return model
 +
 +def fit(model,x_entrenamiento, y_entrenamiento, x_validacion, y_validacion,epochs):
 +    history=model.fit(x_entrenamiento,y_entrenamiento,validation_data=(x_validacion,y_validacion),epochs=epochs,verbose=False)
 +
 +    return history  
 +
 +model=get_model(shape=x_entrenamiento.shape[1:])
 +history=fit(model,x_entrenamiento, y_entrenamiento, x_validacion, y_validacion,30)
 +</sxh>
 +Fijarse que en las capas ''GRU'' hay que indicar ''return_sequences=True'' excepto en la última que debe ser ''return_sequences=False''
 +
 +
 +  * Vamos a mostrar la gráfica de la pérdida en cada época
 +
 +<sxh python>
 +figure=plt.figure(figsize=(6,4))
 +axes = figure.add_subplot(1,1,1)
 +axes.plot(history.history['loss'],label=f"Loss:{history.history['loss'][-1]:.3f}")
 +axes.plot(history.history['val_loss'],label=f"Val Loss:{history.history['val_loss'][-1]:.3f}")
 +axes_configure_labels(axes,"Loss por época","Épocas","MSE")
 +</sxh>
 +
 +{{:clase:iabd:pia:2eval:ejemplo1_gru_loss.png|}}
 +
 +  * 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,25))
 +
 +
 +axes = figure.add_subplot(4,1,1)
 +axes.plot(y_entrenamiento_inverse_transform,label="Real")
 +axes.plot(y_pred_entrenamiento_inverse_transform,label="Predicha")
 +axes_configure_labels(axes,"Todos Entrenamiento","Tiempo","Temperatura")
 +axes.set_xlim(xmin=0,xmax=y_entrenamiento_inverse_transform.shape[0])
 +axes.set_ylim(ymin=-6,ymax=16)
 +
 +axes = figure.add_subplot(4,1,2)
 +axes.plot(y_validacion_inverse_transform,label="Real")
 +axes.plot(y_pred_validacion_inverse_transform,label="Predicha")
 +axes_configure_labels(axes,"Todos Validacion","Tiempo","Temperatura")
 +axes.set_xlim(xmin=0,xmax=y_entrenamiento_inverse_transform.shape[0])
 +axes.set_ylim(ymin=-6,ymax=16)
 +
 +
 +axes = figure.add_subplot(4,1,3)
 +axes.plot(y_entrenamiento_inverse_transform,label="Real")
 +axes.plot(y_pred_entrenamiento_inverse_transform,label="Predicha")
 +axes_configure_labels(axes,"Últimos Entrenamiento","Tiempo","Temperatura")
 +axes.set_xlim(xmin=y_entrenamiento_inverse_transform.shape[0]-500,xmax=y_entrenamiento_inverse_transform.shape[0])
 +axes.set_ylim(ymin=-6,ymax=16)
 +
 +axes = figure.add_subplot(4,1,4)
 +axes.plot(y_validacion_inverse_transform,label="Real")
 +axes.plot(y_pred_validacion_inverse_transform,label="Predicha")
 +axes_configure_labels(axes,"Últimos Validacion","Tiempo","Temperatura")
 +axes.set_xlim(xmin=y_validacion_inverse_transform.shape[0]-500,xmax=y_validacion_inverse_transform.shape[0])
 +axes.set_ylim(ymin=-6,ymax=16)
 +</sxh>
  
-  * Ahora los transformamos en la estructura que quiere Keras que es una matriz para cada dato.+{{:clase:iabd:pia:2eval:ejemplo1_gru_resultados.png|}}
  
clase/iabd/pia/2eval/tema10.1736101024.txt.gz · Última modificación: 2025/01/05 19:17 por admin