Solución:
Realmente – model.save
guarda toda la información necesaria para reiniciar el entrenamiento en su caso. Lo único que podría estropearse al volver a cargar el modelo es el estado de su optimizador. Para comprobarlo, intente save
y recargar el modelo y entrenarlo con datos de entrenamiento.
La mayoría de las respuestas anteriores cubrieron puntos importantes. Si está utilizando Tensorflow reciente (TF2.1
o superior), entonces el siguiente ejemplo te ayudará. La parte modelo del código es del sitio web de Tensorflow.
import tensorflow as tf
from tensorflow import keras
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
def create_model():
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation=tf.nn.relu),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy",metrics=['accuracy'])
return model
# Create a basic model instance
model=create_model()
model.fit(x_train, y_train, epochs = 10, validation_data = (x_test,y_test),verbose=1)
Guarde el modelo en formato * .tf. Según mi experiencia, si tiene una pérdida personalizada definida, el formato * .h5 no guardará el estado del optimizador y, por lo tanto, no servirá para su propósito si desea volver a entrenar el modelo desde donde lo dejamos.
# saving the model in tensorflow format
model.save('./MyModel_tf',save_format="tf")
# loading the saved model
loaded_model = tf.keras.models.load_model('./MyModel_tf')
# retraining the model
loaded_model.fit(x_train, y_train, epochs = 10, validation_data = (x_test,y_test),verbose=1)
Este enfoque reiniciará el entrenamiento donde lo dejamos antes de guardar el modelo. Como lo mencionaron otros, si desea guardar pesos del mejor modelo o desea guardar pesos del modelo en cada época, debe usar la función de devolución de llamada de keras (ModelCheckpoint) con opciones como save_weights_only=True
, save_freq='epoch'
, y save_best_only
.
Para obtener más detalles, consulte aquí y otro ejemplo aquí.
El problema podría ser que usa un optimizador diferente, o diferentes argumentos para su optimizador. Acabo de tener el mismo problema con un modelo preentrenado personalizado, usando
reduce_lr = ReduceLROnPlateau(monitor="loss", factor=lr_reduction_factor,
patience=patience, min_lr=min_lr, verbose=1)
para el modelo preentrenado, en el que la tasa de aprendizaje original comienza en 0.0003 y durante el preentrenamiento se reduce a la tasa min_learning, que es 0.000003
Simplemente copié esa línea en el script que usa el modelo pre-entrenado y obtuve muy malas precisiones. Hasta que me di cuenta de que la última tasa de aprendizaje del modelo preentrenado era la tasa de aprendizaje mínima, es decir, 0,000003. Y si comienzo con esa tasa de aprendizaje, obtengo exactamente las mismas precisiones para comenzar con la salida del modelo preentrenado, lo cual tiene sentido, ya que comenzar con una tasa de aprendizaje que es 100 veces mayor que la última tasa de aprendizaje utilizada en el modelo preentrenado El modelo dará como resultado un gran rebasamiento de GD y, por lo tanto, una precisión muy disminuida.