Загрузка обученной модели Keras и продолжение обучения
Мне было интересно, удалось ли сохранить частично обученную модель Keras и продолжить обучение после загрузки модели снова.
Причина этого в том, что в будущем у меня будет больше данных о тренировках, и я не хочу снова переучивать всю модель.
Функции, которые я использую:
#Partly train model
model.fit(first_training, first_classes, batch_size=32, nb_epoch=20)
#Save partly trained model
model.save('partly_trained.h5')
#Load partly trained model
from keras.models import load_model
model = load_model('partly_trained.h5')
#Continue training
model.fit(second_training, second_classes, batch_size=32, nb_epoch=20)
Изменить 1: добавлен полностью рабочий пример
С первым набором данных после 10 эпох потеря последней эпохи будет 0.0748 и точность 0.9863.
После сохранения, удаления и перезагрузки модели потери и точность модели, обученной на втором наборе данных, будут соответственно 0,1711 и 0,9504.
Это вызвано новыми данными обучения или полностью переделанной моделью?
"""
Model by: http://machinelearningmastery.com/
"""
# load (downloaded if needed) the MNIST dataset
import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import np_utils
from keras.models import load_model
numpy.random.seed(7)
def baseline_model():
model = Sequential()
model.add(Dense(num_pixels, input_dim=num_pixels, init='normal', activation='relu'))
model.add(Dense(num_classes, init='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
if __name__ == '__main__':
# load data
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# flatten 28*28 images to a 784 vector for each image
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
# build the model
model = baseline_model()
#Partly train model
dataset1_x = X_train[:3000]
dataset1_y = y_train[:3000]
model.fit(dataset1_x, dataset1_y, nb_epoch=10, batch_size=200, verbose=2)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
#Save partly trained model
model.save('partly_trained.h5')
del model
#Reload model
model = load_model('partly_trained.h5')
#Continue training
dataset2_x = X_train[3000:]
dataset2_y = y_train[3000:]
model.fit(dataset2_x, dataset2_y, nb_epoch=10, batch_size=200, verbose=2)
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
Ответы
Ответ 1
Фактически - model.save
сохраняет всю информацию, необходимую для перезапуска обучения в вашем случае. Единственное, что может быть испорчено перезагрузкой модели, - это ваше состояние оптимизатора. Чтобы проверить это - попробуйте save
и перезагрузите модель и обучите ее тренировочным данным.
Ответ 2
Обратите внимание, что Keras иногда имеет проблемы с загруженными моделями, как в здесь.
Это может объяснить случаи, когда вы не начинаете с той же подготовленной точности.
Ответ 3
Проблема может заключаться в том, что вы используете другой оптимизатор или другие аргументы для вашего оптимизатора. У меня была та же проблема с пользовательской моделью с предварительной подготовкой, использующей
reduce_lr = ReduceLROnPlateau(monitor='loss', factor=lr_reduction_factor,
patience=patience, min_lr=min_lr, verbose=1)
для модели с предварительной подготовкой, при которой исходная скорость обучения начинается с 0,0003, а во время предварительной подготовки она снижается до уровня min_learning, который составляет 0,000003
Я просто скопировал эту строку в сценарий, который использует предварительно обученную модель, и получил очень плохую точность. До тех пор, пока я не заметил, что последняя скорость обучения предварительно подготовленной модели была минимальной скоростью обучения, то есть 0,000003. И если я начну с этой скорости обучения, то получу в точности ту же точность, что и на выходе предварительно обученной модели - что имеет смысл, начиная с скорости обучения, которая в 100 раз больше, чем последняя скорость обучения, использованная в предварительно обученной модель приведет к огромному выбросу GD и, следовательно, к значительному снижению точности.
Ответ 4
Все выше помогает, вы должны возобновить с той же скорости обучения(), что и LR, когда модель и веса были сохранены. Установите его прямо на оптимизаторе.
Обратите внимание, что улучшение оттуда не гарантируется, потому что модель, возможно, достигла локального минимума, который может быть глобальным. Нет смысла возобновлять модель для поиска другого локального минимума, если только вы не намерены контролировать скорость обучения контролируемым образом и подтолкнуть модель к возможно лучшему минимуму неподалеку.
Ответ 5
Вы также можете попасть в Concept Drift, см. Если вы переучите модель, когда появятся новые наблюдения. Есть также концепция катастрофического забвения, которую обсуждает множество научных работ. Здесь один с MNIST Эмпирическое исследование катастрофического забвения