Estoy tratando de cambiar la tasa de aprendizaje de mi modelo después de haberlo entrenado con una tasa de aprendizaje diferente.
Leí aquí , aquí , aquí y algunos otros lugares que ya ni siquiera puedo encontrar.
Lo intenté:
model.optimizer.learning_rate.set_value(0.1) model.optimizer.lr = 0.1 model.optimizer.learning_rate = 0.1 K.set_value(model.optimizer.learning_rate, 0.1) K.set_value(model.optimizer.lr, 0.1) model.optimizer.lr.assign(0.1)... pero ninguno de ellos funcionó! No entiendo cómo puede haber tanta confusión en torno a algo tan simple. ¿Me estoy perdiendo de algo?
EDITAR: ejemplo de trabajo
Aquí hay un ejemplo práctico de lo que me gustaría hacer:
from keras.models import Sequential from keras.layers import Dense import keras import numpy as np model = Sequential() model.add(Dense(1, input_shape=(10,))) optimizer = keras.optimizers.Adam(lr=0.01) model.compile(loss='mse', optimizer=optimizer) model.fit(np.random.randn(50,10), np.random.randn(50), epochs=50) # Change learning rate to 0.001 and train for 50 more epochs model.fit(np.random.randn(50,10), np.random.randn(50), initial_epoch=50, epochs=50)Debes definirlo en la función de compilación:
optimizer = keras.optimizers.Adam(lr=0.01) model.compile(loss='mse', optimizer=optimizer, metrics=['categorical_accuracy'])Mirando su comentario, si desea cambiar la tasa de aprendizaje después del comienzo, necesita usar un programador: enlace
Edite con su código y planificador:
from keras.models import Sequential from keras.layers import Dense import keras import numpy as np def lr_scheduler(epoch, lr): if epoch > 50: lr = 0.001 return lr return lr model = Sequential() model.add(Dense(1, input_shape=(10,))) optimizer = keras.optimizers.Adam(lr=0.01) model.compile(loss='mse', optimizer=optimizer) callbacks = [keras.callbacks.LearningRateScheduler(lr_scheduler, verbose=1)] model.fit(np.random.randn(50,10), np.random.randn(50), epochs=100, callbacks=callbacks)Puedes cambiar lr durante el entrenamiento con
from keras.callbacks import LearningRateScheduler # This is a sample of a scheduler I used in the past def lr_scheduler(epoch, lr): decay_rate = 0.85 decay_step = 1 if epoch % decay_step == 0 and epoch: return lr * pow(decay_rate, np.floor(epoch / decay_step)) return lrAplicar planificador a su modelo
callbacks = [LearningRateScheduler(lr_scheduler, verbose=1)] model = build_model(pretrained_model=ka.InceptionV3, input_shape=(224, 224, 3)) history = model.fit(train, callbacks=callbacks, epochs=EPOCHS, verbose=1)Suponga que usa el optimizador de Adam en keras , le gustaría definir su optimizador antes de compilar su modelo con él.
Por ejemplo, puede definir
myadam = keras.optimizers.Adam(learning_rate=0.1)Luego, compila su modelo con este optimizador.
En caso de que desee cambiar su optimizador (con un tipo diferente de optimizador o con una tasa de aprendizaje diferente), puede definir un nuevo optimizador y compilar su modelo existente con el nuevo optimizador.
¡Espero que esto ayude!
Hay otra forma, tienes que encontrar la variable que contiene la tasa de aprendizaje y asignarle otro valor.
optimizer = tf.keras.optimizers.Adam(0.001) optimizer.learning_rate.assign(0.01) print(optimizer.learning_rate)producción:
<tf.Variable 'learning_rate:0' shape=() dtype=float32, numpy=0.01>Puede cambiar la tasa de aprendizaje de la siguiente manera:
from keras import backend as K K.set_value(model.optimizer.learning_rate, 0.001)Incluido en su ejemplo completo, se ve de la siguiente manera:
from keras.models import Sequential from keras.layers import Dense from keras import backend as K import keras import numpy as np model = Sequential() model.add(Dense(1, input_shape=(10,))) optimizer = keras.optimizers.Adam(lr=0.01) model.compile(loss='mse', optimizer=optimizer) print("Learning rate before first fit:", model.optimizer.learning_rate.numpy()) model.fit(np.random.randn(50,10), np.random.randn(50), epochs=50, verbose=0) # Change learning rate to 0.001 and train for 50 more epochs K.set_value(model.optimizer.learning_rate, 0.001) print("Learning rate before second fit:", model.optimizer.learning_rate.numpy()) model.fit(np.random.randn(50,10), np.random.randn(50), initial_epoch=50, epochs=50, verbose=0)Acabo de probar esto con Keras 2.3.1. No estoy seguro de por qué el enfoque no pareció funcionar para usted.
Hace un tiempo tuve un proyecto para el cual necesitaba algo similar. Mi idea para cambiar la tasa de aprendizaje fue compilar un nuevo modelo con la nueva tasa, luego cargar los pesos de los parámetros del modelo anterior al nuevo.
Para tu ejemplo:
from keras.models import Sequential from keras.layers import Dense import keras import numpy as np # Initial model model = Sequential() model.add(Dense(1, input_shape=(10,))) optimizer = keras.optimizers.Adam(lr=0.01) model.compile(loss='mse', optimizer=optimizer) model.fit(np.random.randn(50,10), np.random.randn(50), epochs=50) # Change learning rate to 0.001 and train for 50 more epochs new_model = Sequential() new_model.add(Dense(1, input_shape=(10,))) optimizer = keras.optimizers.Adam(lr=0.001) new_model.compile(loss='mse', optimizer=optimizer) new_model.set_weights(model.get_weights()) model = new_model model.fit(np.random.randn(50,10), np.random.randn(50), initial_epoch=50, epochs=50)Con esto podrías ver un peor ajuste de tu modelo en las primeras épocas porque ADAM usa pasos anteriores para optimizar y los perderás.
¡Espero que ayude a alguien!