Возобновить обучение с оптимизатором Adam в Керасе

Мой вопрос довольно простой, но я не могу найти однозначного ответа в Интернете (пока).

Я сохранил веса модели keras, обученной с помощью оптимизатора adam после определенного количества эпох обучения, используя:

callback = tf.keras.callbacks.ModelCheckpoint(filepath=path, save_weights_only=True)
model.fit(X,y,callbacks=[callback])

Когда я возобновлю обучение после закрытия своего jupyter, могу ли я просто использовать:

model.load_weights(path)

продолжить обучение.

Поскольку Адам зависит от номера эпохи (например, в случае снижения скорости обучения), я хотел бы знать самый простой способ возобновить тренировки в тех же условиях, что и раньше.

После ответа Ибарронда я написал небольшой пользовательский обратный вызов.

optim = tf.keras.optimizers.Adam()
model.compile(optimizer=optim, loss='categorical_crossentropy',metrics=['accuracy'])

weight_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, save_weights_only=True, verbose=1, save_best_only=False)

class optim_callback(tf.keras.callbacks.Callback):
    '''Custom callback to save optimiser state'''

          def on_epoch_end(self,epoch,logs=None):
                optim_state = tf.keras.optimizers.Adam.get_config(optim)
                with open(optim_state_pkl,'wb') as f_out:                  
                       pickle.dump(optim_state,f_out)

model.fit(X,y,callbacks=[weight_callback,optim_callback()])

Когда я возобновлю тренировки:

model.load_weights(checkpoint_path)
with open(optim_state_pkl,'rb') as f_out:                  
                    optim_state = pickle.load(f_out)
tf.keras.optimizers.Adam.from_config(optim_state)

Я просто хочу проверить, правильно ли это. Еще раз большое спасибо !!

Приложение: При дальнейшем чтении реализации Keras Адама по умолчанию и исходный документ Адама, я считаю, что Адам по умолчанию не зависит от номера эпохи, а только от номер итерации. Следовательно, в этом нет необходимости. Однако код может быть полезен всем, кто хочет отслеживать работу других оптимизаторов.


person sunnydk    schedule 05.02.2020    source источник
comment
Почему в этом нет необходимости, если Адам не зависит от номера эпохи? Разве номер эпохи и номер итерации недостаточно связаны, чтобы вы все еще хотели отслеживать их при возобновлении обучения? Epoch = iteration * batch_size, и поскольку batch_size (в большинстве случаев) константа, я предполагаю, что они оба одинаково важны.   -  person ibarrond    schedule 06.02.2020
comment
@ibarrond Причина, по которой я убедился, что Адам не меняет эпохи, заключается в том, что распечатка dict из get_config показывает исходную конфигурацию Адама по умолчанию в Керасе. Следовательно, я думал, что он остается постоянным. Однако вы заставляете меня думать, что, может быть, это еще не все. На самом деле нет смысла изменять только lr в каждой эпохе и перезапускать обратно к lr по умолчанию в следующую эпоху. Но я не могу найти в keras документации о том, как итерация отслеживается между эпохами. Если это так, то не похоже, что get_config дает мне всю информацию о состоянии оптимизатора.   -  person sunnydk    schedule 06.02.2020


Ответы (1)


Чтобы точно отслеживать состояние вашего оптимизатора, вы должны сохранить его конфигурацию с помощью функции _ 1_. Эта функция возвращает словарь (содержащий параметры), который можно сериализовать и сохранить в файле с помощью _ 2_.

Чтобы перезапустить процесс, просто d = pickle.load('my_saved_tfconf.txt'), чтобы получить словарь с конфигурацией, а затем сгенерировать свой Adam Optimizer, используя функцию from_config(d) из Keras Adam Optimizer.

person ibarrond    schedule 05.02.2020
comment
Большое спасибо за этот совет, звучит как более разумный подход :) - person sunnydk; 05.02.2020
comment
Я добавил небольшой собственный код и хотел бы знать, правильно ли он реализован, если возможно, извиняюсь за проблемы! - person sunnydk; 05.02.2020