Подтвердить что ты не робот

Загрузка обученной модели 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))
4b9b3361

Ответ 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, когда модель и веса были сохранены. Установите его прямо на оптимизаторе.

Обратите внимание, что улучшение оттуда не гарантируется, потому что модель, возможно, достигла локального минимума, который может быть глобальным. Нет смысла возобновлять модель для поиска другого локального минимума, если только вы не намерены контролировать скорость обучения контролируемым образом и подтолкнуть модель к возможно лучшему минимуму неподалеку.