Keras возобновляет обучение новой архитектуре

#python #tensorflow #optimization #keras

#python #tensorflow #оптимизация #keras

Вопрос:

Я пытаюсь возобновить обучение простой архитектуре 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. Вы пытаетесь делать две вещи одновременно. Не могли бы вы, пожалуйста, сначала проверить, сможете ли вы возобновить обучение той же архитектуре без каких-либо проблем? После этого шага, пожалуйста, попробуйте изменить архитектуру.

2. Кажется, что значения потерь странно меняются, но модель правильно перезагружена. Начальные потери при проверке в эпоху 3 — это те же потери при проверке в конце эпохи 2.

3. Как именно вы обновляете архитектуру модели?

4. Хотя я согласен с @ManojMohan. Сначала посмотрите, работает ли перезагрузка модели и продолжение обучения без изменения архитектуры модели

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

Ответ №1:

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


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

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

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