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.

El transformador no funcionó bien con el cinturón de gradiente de TensorFlow.

Implementé el transformer con TensorFlow 2.0. El modelo funciona bien cuando entreno el modelo con model.fit(dataset).

Sin embargo, cuando entreno el modelo con tensorflow.GradientTape y lo evaluo, el modelo devuelve el token de espacio en blanco para todas las entradas. Aquí está mi código, y la versión de TensorFlow es 2.7.0.

def loss_function(y_true, y_pred):
  y_true = tf.reshape(y_true, shape=(-1, MAX_LENGTH - 1))

  loss = tf.keras.losses.SparseCategoricalCrossentropy(
      from_logits=True, reduction='none')(y_true, y_pred)


  mask = tf.cast(tf.not_equal(y_true, 0), tf.float32)
  loss = tf.multiply(loss, mask)
  return tf.reduce_mean(loss)

for epoch in range(num_epochs):
  for step, data in enumerate(dataset):
    enc_inputs, dec_inputs, outputs = data[0]['inputs'], data[0]['dec_inputs'], data[1]['outputs']

    with tf.GradientTape() as tape:
      logits = model([enc_inputs, dec_inputs], training = True)
      loss   = loss_function(outputs, logits)

    grads = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(grads, model.trainable_variables))

Creo que no hay problema con mi código del modelo transformer, porque funciona bien con model.fit(dataset). ¿Qué hay de malo con mi código?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar en el código de evaluación al usar tf.GradientTape en lugar del método model.fit(). Sin ver el código de evaluación, es difícil determinar el problema exacto. Sin embargo, aquí hay algunas posibles soluciones:

    1. Verifica si estás utilizando un pipeline de entrada o una función de preprocesamiento diferente para la evaluación. Es posible que el código del conjunto de datos no esté configurado correctamente para la evaluación.
    2. Asegúrate de establecer el modo en ‘eval’ o envolver el código de evaluación dentro de la función model.evaluate(). Esto es necesario cuando se utiliza la normalización por lotes u otras capas que se comportan de manera diferente durante el entrenamiento y la evaluación.

    3. Asegúrate de que el modelo esté correctamente inicializado y cargado con los pesos antes de la evaluación. Utiliza model.load_weights() para cargar los pesos guardados o model.build() para inicializar el modelo.

    4. Si estás utilizando capas o funciones de pérdida personalizadas, verifica que estén correctas y que los gradientes se estén calculando correctamente.

    5. Intenta cambiar el optimizador o la tasa de aprendizaje, ya que el problema podría estar en el algoritmo de optimización.

    Espero que esto te ayude a resolver el problema con tu código.

Comments are closed.