es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pérdida de valor + el resultado de la red codificador-decodificador LSTM devuelve NaN – TensorFlow 2.x

Actualmente estoy entrenando una red codificador-decodificador seq2seq potenciada por LSTM en TensorFlow 2.x. El problema principal en este momento es que la pérdida se acerca a NaN y las predicciones devueltas también son NaN. Entiendo la posibilidad de gradientes explosivos/desvanecidos y he implementado varias formas de intentar combatirlo (ejemplo: agregar capas de min-max, agregar regularizaciones L2, usar clipnorm/clipvalues y cambiar la tasa de aprendizaje, etc.). Se han intentado casi todos los métodos investigables para combatir este problema, pero el problema persiste.

La arquitectura es la siguiente:
“`
tamaño<em>de</em>incrustación = 16
LONGITUD<em>DE</em>ENTRADA = X.shape[1]

<h1>LONGITUD<em>DE</em>SALIDA<em>MÁXIMA = y.shape[1]</em></h1>

LONGITUD<em>DE</em>SALIDA<em>MÁXIMA = 10</em>

<h1>para la normalización min-max – crear una capa de min-max</h1>

min<em>global = np.min(X</em>train)
max<em>global = np.max(X</em>train)
capa<em>min</em>max = keras.layers.Lambda(lambda x: (x – min<em>global) / (max</em>global – min_global))

<h1>definir modelo codificador</h1>

codificador = keras.models.Sequential()
codificador.add(keras.layers.Embedding(input<em>dim=len(aa</em>tokenizer.word<em>index) + 1,
output</em>dim=tamaño<em>de</em>incrustación,
inputshape=[None]))
# input<em>length=LONGITUD</em>DESALIDA<em>MÁXIMA))
codificador.add(capa</em>minmax)
codificador.add(keras.layers.LSTM(16, activityregularizer=keras.regularizers.L2(0.1)))

<h1>definir modelo decodificador</h1>

decodificador = keras.models.Sequential()

<h1>decodificador.add(capa<em>min</em>max)</h1>

decodificador.add(keras.layers.LSTM(16, return<em>sequences=True, activity</em>regularizer=keras.regularizers.L2(0.1)))

<h1>decodificador.add(capa<em>min</em>max)</h1>

decodificador.add(keras.layers.Dense(len(codon<em>tokenizer.word</em>index) + 1, activation='softmax'))

<h1>definir modelo de inferencia</h1>

modelo = keras.models.Sequential([codificador, keras.layers.RepeatVector(LONGITUD<em>DE</em>SALIDA<em>MÁXIMA), decodificador])</em>

optimizador = keras.optimizers.Adam(learning<em>rate=0.001, clipnorm=1.0)
modelo.compile(loss="categorical<em>cruzada</em>escasa", optimizer=optimizador,
metrics=["precisión"])
historia = modelo.fit(X</em>train[:, :10, :], y<em>train[:, :10], epochs=2, validation</em>split=0.15)
“`

Con la salida: pérdida: nan - precisión: 0.0527 - val_pérdida: nan - val_precisión: 0.0000e+00

(Nota: actualmente esta red se entrena en secuencias con una longitud de 10 por razones de velocidad y pruebas, pero el objetivo original es entrenar en secuencias con una longitud de 2,400).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema de pérdida y predicciones NaN en una red de codificador-decodificador Seq2Seq alimentada por LSTM en TensorFlow 2.x puede ser causado por varios factores. Una de las principales razones es el estallido o desvanecimiento de los gradientes, que puede provocar desbordamiento o subflujo numérico durante el entrenamiento. Para combatir este problema, se han implementado varios métodos como agregar capas de mínimos y máximos, regularización L2, clipnorm/clipvalues y cambiar la tasa de aprendizaje. Sin embargo, ninguno de estos métodos ha solucionado el problema.

    Otra razón podría ser la falta de datos o muestras de entrenamiento insuficientes. Esto podría dificultar que la red generalice correctamente y causar sobreajuste.

    Además, el problema de NaN también puede ser causado por un formato incorrecto de los datos, especialmente si los datos de entrada no están preprocesados o normalizados correctamente.

    En este caso, la arquitectura de la red parece razonable, pero la longitud de secuencia de los conjuntos de entrenamiento y validación podría ser un problema. Entrenar con una longitud de secuencia más corta (10 en este caso) por cuestiones de velocidad y pruebas puede no proporcionar suficiente información para que la red aprenda y generalice correctamente. Por lo tanto, entrenar con una longitud de secuencia más larga, en el objetivo original de 2,400, podría ayudar a la red a aprender patrones y generalizar mejor.

    Finalmente, es importante tener en cuenta que la pérdida NaN en las redes LSTM también puede ser causada por errores en el código. Por lo tanto, es importante verificar el código en busca de errores y asegurarse de que la red esté definida correctamente.

Comments are closed.