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.

Cómo trazar las curvas de aprendizaje para cada prueba utilizando el keras-tuner.

Estoy utilizando el ajuste de modelos keras para la selección de modelos de mi red neuronal para una tarea de regresión. Me gustaría trazar las curvas de aprendizaje para la pérdida y la pérdida de validación para cada iteración de la búsqueda aleatoria. ¿Cómo puedo hacerlo?

Este es mi código:

def model_builder(hp):
  model = tf.keras.Sequential()

  layers = hp.Choice('layers', values=[1,2,3,4,5])
  units = hp.Choice('units', values=[1,2,4,8,16,32,64,128,256,512,1024])
  hp_learning_rate = hp.Choice('learning_rate', values=[1e-1, 1e-2, 1e-3, 1e-4])

  for i in range(1, layers):
    model.add(tf.keras.layers.Dense(units=units, activation='relu'))

  model.add(tf.keras.layers.Dense(2, activation='linear'))
  model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=hp_learning_rate),
                loss='mse')

  return model

tuner = RandomSearch(model_builder,
          objective='val_loss',
          max_trials=50,
      )

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=20)
tuner.search(X_train, y_train, epochs=200, validation_split=0.2, callbacks=[stop_early])
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para trazar las curvas de aprendizaje para la pérdida y la pérdida de validación para cada iteración de la búsqueda aleatoria utilizando el sintonizador keras, podemos utilizar la funcionalidad de callback del paquete keras-tuner. Específicamente, podemos utilizar la función tf.keras.callbacks.History() para almacenar los resultados de cada ejecución de entrenamiento y trazar las curvas de aprendizaje posteriormente.

    Aquí está el código modificado con la función de callback añadida:

    def model_builder(hp):
      model = tf.keras.Sequential()
    
      layers = hp.Choice('layers', values=[1,2,3,4,5])
      units = hp.Choice('units', values=[1,2,4,8,16,32,64,128,256,512,1024])
      hp_learning_rate = hp.Choice('learning_rate', values=[1e-1, 1e-2, 1e-3, 1e-4])
    
      for i in range(1, layers):
        model.add(tf.keras.layers.Dense(units=units, activation='relu'))
    
      model.add(tf.keras.layers.Dense(2, activation='linear'))
      model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=hp_learning_rate),
                    loss='mse')
    
      return model
    
    tuner = RandomSearch(model_builder,
                objective="val_loss",
                max_trials=50,
                executions_per_trial=3, # para obtener resultados más precisos
            )
    
    # Define el callback para rastrear la pérdida y la pérdida de val_loss después de cada época de entrenamiento
    class TraceTraining(tf.keras.callbacks.Callback):
      def __init__(self, num_epochs):
        self.num_epochs = num_epochs
        self.history = {}
    
      def on_train_begin(self, logs={}):
        self.history = {'loss': [], 'val_loss': []}
    
      def on_epoch_end(self, epoch, logs={}):
        # Guarda la pérdida y la pérdida de val_loss para cada época en el diccionario history
        self.history['loss'].append(logs.get('loss'))
        self.history['val_loss'].append(logs.get('val_loss'))
    
    # Utiliza el callback TraceTraining al buscar modelos
    stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=20)
    trace = TraceTraining(num_epochs=200) # num_epochs debe coincidir con los epochs en la llamada tuner.search()
    tuner.search(X_train, y_train, epochs=200, validation_split=0.2, callbacks=[stop_early, trace])
    
    # Traza las curvas de aprendizaje para la pérdida y la val_loss para cada ejecución en la búsqueda aleatoria
    for i, run in enumerate(tuner.oracle.get_best_trials(num_trials=50)):
      plt.plot(trace.history['loss'][i], label=f'ejecución {i+1}') # traza la pérdida de entrenamiento
      plt.plot(trace.history['val_loss'][i], label=f'ejecución {i+1} val') # traza la pérdida de validación
    plt.xlabel('Época')
    plt.ylabel('Pérdida')
    plt.legend()
    plt.show()
    

    Este código define una callback TraceTraining que rastrea la pérdida y la pérdida de validación después de cada época de entrenamiento, y guarda los resultados en un diccionario history. Esta callback se utiliza durante la búsqueda del modelo, pasándolo como parámetro a la función callbacks de la función tuner.search().

    Después de ejecutar la búsqueda, podemos iterar sobre cada ejecución en la búsqueda aleatoria y trazar las curvas de aprendizaje accediendo a los valores almacenados en el diccionario history.

    Ten en cuenta que también hemos añadido un parámetro executions_per_trial a la función RandomSearch, que especifica cuántas veces entrenar cada modelo con inicializaciones diferentes. Este parámetro puede ayudar a aumentar la precisión de los resultados de la búsqueda.

Comments are closed.