Керас возобновил обучение по новой архитектуре - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь возобновить обучение простой NN-архитектуре после ее модификации.Используя набор данных MNIST, в этом примере я обучаю модель 2 эпохам, а затем сохраняю модель в файле .h5.Затем я перезагружаю модель, изменяю модель и перекомпилирую ее.Но я хочу возобновить обучение именно там, где я его остановил.Поэтому я хотел бы использовать оптимизатор перезагруженной модели, чтобы продолжить обучение.Вот код:

MLP = keras.models.Sequential([
        keras.layers.Dense(100, activation='sigmoid', input_shape=(784,)),
        keras.layers.Dense(10, activation='softmax')
    ])
MLP.compile(optimizer=tf.keras.optimizers.Adam(lr=0.5), loss=tf.losses.log_loss, metrics=['accuracy'])
training_output = MLP.fit(x_train, y_train, epochs=2, validation_data=(x_val, y_val), verbose=2, initial_epoch=0)

MLP.save('test.h5')



MLP = keras.models.load_model('test.h5', custom_objects={'log_loss': log_loss})
modelt = MLP
modelt = # update modelt architecture


modelt.compile(optimizer=MLP.optimizer, loss=tf.losses.log_loss, metrics=['accuracy'])
training_output = modelt.fit(x_train, y_train, epochs=4, validation_data=(x_val, y_val), verbose=2, initial_epoch=2)

Проблема в том, что:

Epoch 1/2

 - 1s - loss: 1.2690 - acc: 0.2216 - val_loss: 1.3097 - val_acc: 0.2095

Epoch 2/2

 - 1s - loss: 1.2859 - acc: 0.2030 - val_loss: 1.2420 - val_acc: 0.1760

Epoch 3/4

 - 1s - loss: 2.8945 - acc: 0.0993 - val_loss: 2.9367 - val_acc: 0.0890

Epoch 4/4

 - 1s - loss: 2.9035 - acc: 0.0993 - val_loss: 2.9367 - val_acc: 0.0890

Тренировка остается каким-то застрявшим или хуже.Как я могу решить эту проблему?Даже при попытке создать новый объект Adam Optimizer и сбросе всех значений, к которым я могу прикоснуться, поведение не меняется.Как правильно использовать повторно загруженный оптимизатор?

Большое спасибо за помощь!

РЕДАКТИРОВАТЬ: простое сохранение и перезагрузка модели возвращает следующие результаты:

lr begin: 0.15811755
begin: [0.35258077597618104, 0.1265]
lr end: 0.25961164
end: [1.0754492826461792, 0.2785]
-------------------------------------------------------------
lr begin: 0.25961164
begin: [1.0754492826461792, 0.2785]
lr end: 0.34131044
end: [1.5968322057723998, 0.2185]
-------------------------------------------------------------
lr begin: 0.34131044
begin: [1.5968322057723998, 0.2185]
lr end: 0.3903688
end: [2.8819153175354004, 0.106]
-------------------------------------------------------------
lr begin: 0.3903688
begin: [2.8819153175354004, 0.106]
lr end: 0.42264876
end: [2.8819153175354004, 0.106]

1 Ответ

0 голосов
/ 13 марта 2019

Я вошел в чат, чтобы обсудить этот вопрос с @TheNobleSix, и нашел там ответ, но он не ответил мне. Итак, я пишу это здесь, чтобы помочь будущей аналогичной проблеме, которую мог бы иметь другой пользователь.


При перезагрузке модели вам не следует перекомпилировать модель , как описано в Документация Keras ! Это приводит к тому, что оптимизатор потерял свое предыдущее состояние. И это то, что происходило, когда вы пытались выполнить каждую часть задачи в отдельности, как это предлагается в комментариях.

Имея это в виду, в зависимости от того, какие модификации вы хотите сделать в своей модели, может быть, стало неуместно продолжать обучение в той же точке или стало очень трудно настроить обновленную модель для продолжения обучения из той же значение потери / точности. Следовательно, изменение количества параметров может резко изменить целевую функцию. Например, если вы измените количество нейронов в слое или добавите новый слой, вам нужно будет инициализировать новые нейроны. Возможным обходным путем для этого было бы перераспределение весов слоя (если это был первый случай) среди нейронов. Следствием этого является потеря возможных паттернов, которые этот слой уже определил.

Я знаю, что предыдущий абзац очень умозрительный. Если вы опишите конкретную модификацию, которую вы делаете в архитектуре, я мог бы попытаться дать вам более точный ответ об обновлении модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...