Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
clase:iabd:pia:2eval:tema10 [2021/07/24 10:01] admin creado |
clase:iabd:pia:2eval:tema10 [2025/01/06 11:22] (actual) admin [Ejemplo] |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== Redes Neuronales Recurrentes ====== | + | ====== |
+ | Las redes neuronales recurrentes son redes neuronales que dependen de los datos anteriores, es decir que tienen " | ||
+ | Por ejemplo, al predecir si una foto es un tipo de flor, no depende de lo que se haya predecido antes pero en una red neuronal si. | ||
+ | Son redes que predicen secuencias de datos como por ejemplo series de temperatura, | ||
+ | * Procesamiento de lenguaje natural (NLP): | ||
+ | * Traducción automática: | ||
+ | * Generación de texto: Pueden generar texto, completando frases o creando contenido basado en ejemplos previos, como en los modelos de lenguaje. | ||
+ | * Análisis de sentimiento: | ||
+ | * Reconocimiento de voz: | ||
+ | * Las RNN son comunes en los sistemas de reconocimiento automático de voz (ASR), donde deben entender las secuencias temporales de las ondas sonoras para convertirlas en texto. | ||
+ | * Generación de música: | ||
+ | * Se usan para generar música en formato MIDI, ya que las composiciones musicales tienen una estructura secuencial y temporal, similar al lenguaje. | ||
+ | * Análisis de series temporales: | ||
+ | * Predicción de la bolsa de valores: Se pueden emplear para predecir precios de acciones basados en datos históricos. | ||
+ | * Pronóstico meteorológico: | ||
+ | * Detección de anomalías: En sistemas de monitoreo de sensores, las RNN pueden identificar patrones inusuales en las series temporales. | ||
+ | * Modelado de secuencias de video: | ||
+ | * En aplicaciones de visión por computadora, | ||
+ | * Robótica: | ||
+ | * Se usan para controlar robots en tareas que requieren la interpretación de secuencias temporales, como la navegación o el seguimiento de trayectorias en tiempo real. | ||
+ | * Diagnóstico médico: | ||
+ | * Análisis de secuencias de ECG o datos de sensores para detectar patrones relacionados con enfermedades o eventos de salud. | ||
+ | * Sistemas de recomendación: | ||
+ | * Pueden analizar el comportamiento pasado de un usuario (como en la navegación web o la compra de productos) para predecir lo que podría interesarle en el futuro. | ||
+ | * Redes sociales: | ||
+ | * En plataformas de redes sociales, las RNN se utilizan para analizar la evolución de los comentarios o publicaciones, | ||
+ | Para hacer este tipo de redes se usan nuevas capas que son: | ||
+ | * **RNN estándar**: | ||
+ | * **LSTM (Long Short-Term Memory)**: Son una mejora de las RNN estándar por lo que recuerdan lo que ocurre a largo plazo. | ||
+ | * **GRU (Gated Recurrent Unit)**: Parecidas a las LSTM pero más sencillas. Tienen la ventaja de que se entrenan con muchas menos épocas pero son peores si la relación a " | ||
+ | |||
+ | En Keras las 3 capas se definen así: | ||
+ | <sxh python> | ||
+ | from tensorflow.keras.layers import RNN | ||
+ | from tensorflow.keras.layers import LSTM | ||
+ | from tensorflow.keras.layers import GRU | ||
+ | </ | ||
+ | |||
+ | Por ahora no vamos a contar como son estas neuronas pero su esquema es este: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Las fórmulas matemáticas de cada tipo de neurona se puede ver en [[http:// | ||
+ | |||
+ | Más información: | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | ===== Ejemplo ===== | ||
+ | Vamos a hacer una red neuronal que dado 24 temperatura (una por cada hora) obtener la temperatura que hará 12 horas despues. | ||
+ | |||
+ | |||
+ | * Vamos a generar una serie de datos temporales de temperaturas a lo largo del día y que cada día van aumentando. | ||
+ | |||
+ | <sxh python> | ||
+ | def get_serie_tiempo(datetime_start, | ||
+ | np.random.seed(7) | ||
+ | |||
+ | num_datos = num_dias*24 | ||
+ | | ||
+ | |||
+ | |||
+ | x = np.linspace(0, | ||
+ | fechas = pd.date_range(start=datetime_start, | ||
+ | tendencia = np.linspace(0, | ||
+ | onda = amplitud * np.sin(x) | ||
+ | ruido = np.random.normal(0, | ||
+ | |||
+ | datos = tendencia + onda + ruido | ||
+ | |||
+ | return fechas, | ||
+ | |||
+ | fechas, | ||
+ | |||
+ | figure=plt.figure(figsize=(20, | ||
+ | |||
+ | axes = figure.add_subplot(2, | ||
+ | axes.plot(fechas, | ||
+ | axes_configure_labels(axes," | ||
+ | </ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | * 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, | ||
+ | </ | ||
+ | |||
+ | {{: | ||