Estoy tratando de comenzar a aprender sobre RNN y estoy usando Keras. Entiendo la premisa básica de las capas RNN y LSTM de vainilla, pero tengo problemas para comprender un cierto punto técnico para el entrenamiento.
En la documentación de Keras , dice que la entrada a una capa RNN debe tener forma (batch_size, timesteps, input_dim)
. Esto sugiere que todos los ejemplos de entrenamiento tienen una longitud de secuencia fija, a saber timesteps
.
Pero esto no es especialmente típico, ¿verdad? Es posible que desee que el RNN opere en oraciones de diferentes longitudes. Cuando lo entrene en algún corpus, lo alimentaré con lotes de oraciones, de diferentes longitudes.
Supongo que lo obvio sería encontrar la longitud máxima de cualquier secuencia en el conjunto de entrenamiento y ponerla a cero. Pero entonces, ¿eso significa que no puedo hacer predicciones en el momento de la prueba con una longitud de entrada mayor que eso?
Esta es una pregunta sobre la implementación particular de Keras, supongo, pero también estoy preguntando qué hacen las personas cuando se enfrentan a este tipo de problema en general.
Masking
capa para ignorarRespuestas:
Eso no es del todo correcto, ya que esa dimensión puede ser
None
, es decir, longitud variable. Dentro de un solo lote , debe tener el mismo número de pasos de tiempo (esto es típicamente donde se ve el relleno 0 y el enmascaramiento). Pero entre lotes no existe tal restricción. Durante la inferencia, puede tener cualquier longitud.Código de ejemplo que crea lotes aleatorios de datos de entrenamiento de duración prolongada.
Y esto es lo que imprime. Tenga en cuenta que las formas de salida
(None, None, x)
indican un tamaño de lote variable y un tamaño de paso de tiempo variable.fuente
fit()
, podemos pasar elsequence_lenth
parámetro para especificar la longitud de la secuencia para excluirla. Parece que el enfoque del generador no permite ignorar 0 secuencias?(inputs, targets, sample_weights)
, y puede establecersample_weights
sus 0 pads en 0. Sin embargo, no estoy seguro de que esto funcione perfectamente para RNN bidireccionales.model.predict_generator
con un conjunto de prueba. Cuando trato de predecir con un generador me sale un error con respecto a la concatenación (el conjunto de prueba también tiene secuencias de longitud variable). Mi solución ha sido usar el estándarmodel.predict
de una manera hacky. ¿Quizás esto sería mejor para una nueva pregunta?@kbrose parece tener una mejor solución
Esta suele ser una buena solución. Tal vez intente la longitud máxima de secuencia + 100. Use lo que funcione mejor para su aplicación.
No necesariamente. La razón por la que se usa una longitud fija en keras es porque mejora enormemente el rendimiento al crear tensores de formas fijas. Pero eso es solo para entrenar. Después del entrenamiento, habrás aprendido los pesos correctos para tu tarea.
Supongamos que, después de entrenar durante horas, se da cuenta de que la longitud máxima de su modelo no era lo suficientemente grande / pequeña y ahora necesita cambiar los pasos de tiempo, simplemente extraer los pesos aprendidos del modelo anterior, construir un nuevo modelo con los nuevos pasos de tiempo e inyectarle los pesos aprendidos.
Probablemente puedas hacer esto usando algo como:
new_model.set_weights(old_model.get_weights())
No lo he probado yo mismo. Pruébelo y publique sus resultados aquí para beneficio de todos. Aquí hay algunos enlaces: uno dos
fuente
max length + 100
. Vea mi respuesta para el código de ejemplo.Bidirectional(LSTM)()
y lasRepeatVector()
capas, y las predicciones son perfectamente viables.