Sesión 31 de Mayo Series de tiempo¶
Recursos¶
https://colab.research.google.com/drive/1Hi3s3IXGG8SLkOHmGsW0XWHRMq-wPwxG?usp=sharing
Apuntes de clase¶
Predicción de un valor en el futuro¶
Modelo sencillo de RNN
model = keras.models.Sequential([
keras.layers.SimpleRNN(1, input_shape = [None,1])
])
optimizer = keras.optimizers.Adam(learning_rate=0.005)
model.compile(loss="mse", optimizer = optimizer)
history = model.fit(X_train,
y_train,
epochs=20,
validation_data=(X_valid,y_valid))
Este modelo solo tiene una neurona recurrente (1 solo paso) solo contiene una neurona recurrente
Modelo un poco más elaborado
model = keras.models.Sequential([
keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None,1]),
keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None,1]),
keras.layers.SimpleRNN(1)
])
model.compile(loss = "mse", optimizer = "adam")
history = model.fit(X_train,
y_train,
epochs = 20,
validation_data = (X_valid,y_valid))
Este modelo tiene 2 capas ocultas de 20 neuronas recurrentes cada, al decirle return_sequences=True, vamos a tomar varias veces las salidas de cada capa y ajustamos los pesos. Una vez se haya hecho este proceso, entonces se manda la salida a la siguiente capa.
Modelo más elaborado modificado
model = keras.models.Sequential([
keras.layers.SimpleRNN(20,return_sequences = True, input_shape=[None,1]),
keras.layers.SimpleRNN(20),
keras.layers.Dense(1)
])
model.compile(loss="mse", optimizer="adam")
history = model.fit(X_train,y_train,
epochs=20,
validation_data=(X_valid,y_valid))
A diferencia del anterior, la segunda capa sólo tiene un paso de memoria, es decir la salida solo se devuelve una vez.
Predicción de varios valores a futuro¶
¿Que cambia en el diseño de las redes?
Ya no tenemos una sola salida, si no n salidas, donde n es el número de datos que QUEREMOS PREDECIR.
model_simple = keras.models.Sequential([
keras.layers.Flatten(input_shape=[50,1]),
keras.layers.Dense(10)
])
model_mas_complejo = keras.models.Sequential([
keras.layers.SimpleRNN(20, return_sequences=True, input_shape=[None, 1]),
keras.layers.SimpleRNN(20),
keras.layers.Dense(10)
])
¿Que diferencia vimos?
La diferencia es que el modelo con memoria (recurrentes) se aproxima mucho mejor a los datos futuros (modelo de juguete)
Diferentes tipos de neuronas recurrentes¶
LSTM
Muy precisa, pero costosa en recursos
model = keras.models.Sequential([
keras.layers.LSTM(20,return_sequences=True, input_shape=[None,1]),
keras.layers.LSTM(20,return_sequences=True),
keras.layers.TimeDistributed(keras.layers.Dense(10))
])
La capa TimeDistributed permite tomar las salidas en todos los tiempos de las capas anteriores (permite tener memoria a largo plazo)
GRU
Es menos costosa en recursos, pero no es tan buena como LSTM
model = keras.models.Sequential([
keras.layers.GRU(20, return_sequences=True, input_shape=[None,1]),
keras.layers.GRU(20, return_sequences=True),
keras.layers.TimeDistributed(keras.layers.Dense(10))
])
GRU + Conv
De bajo costo, pero mejora el rendimiento del modelo
model = keras.models.Sequential([
keras.layers.Conv1D(filters = 20, kernel_size = 4, strides = 2, padding = "valid", input_shape=[None,1]),
keras.layers.GRU(20, return_sequences=True),
keras.layers.GRU(20, return_sequences=True),
keras.layers.TimeDistributed(keras.layers.Dense(10))
])