Керас — нет хорошего способа остановиться и возобновить тренировки?

#python #tensorflow #keras #tensorflow2.0 #tf.keras

#python #тензорный поток #keras #tensorflow2.0 #tf.keras

Вопрос:

После долгих исследований кажется, что нет хорошего способа правильно остановить и возобновить обучение с использованием модели Tensorflow 2 / Keras. Это верно независимо от того, используете ли вы model.fit() или пользовательский цикл обучения.

Кажется, существует 2 поддерживаемых способа сохранения модели во время обучения:

  1. Сохраните только веса модели, используя model.save_weights() или save_weights_only=True с tf.keras.callbacks.ModelCheckpoint . Похоже, это предпочтительнее большинства примеров, которые я видел, однако у этого есть ряд серьезных проблем:

    • Состояние оптимизатора не сохраняется, что означает, что возобновление обучения не будет корректным.
    • График скорости обучения сбрасывается — это может привести к катастрофическим последствиям для некоторых моделей.
    • Журналы Tensorboard возвращаются к шагу 0, что делает ведение журнала по существу бесполезным, если не будут реализованы сложные обходные пути.
  2. Сохраните всю модель, оптимизатор и т.д. с помощью model.save() или save_weights_only=False . Состояние оптимизатора сохранено (хорошее), но остаются следующие проблемы:

    • Журналы тензорной доски по-прежнему возвращаются к шагу 0
    • График скорости обучения по-прежнему сброшен (!!!)
    • Невозможно использовать пользовательские показатели.
    • Это вообще не работает при использовании пользовательского цикла обучения — пользовательские циклы обучения используют не скомпилированную модель, а сохранение / загрузка не скомпилированной модели, похоже, не поддерживается.

Лучший способ, который я нашел, — использовать пользовательский цикл обучения, вручную сохраняя шаг. Это исправляет ведение журнала в tensorboard, а график скорости обучения можно исправить, выполнив что-то вроде keras.backend.set_value(model.optimizer.iterations, step) . Однако, поскольку полное сохранение модели исключено из таблицы, состояние оптимизатора не сохраняется. Я не вижу способа сохранить состояние оптимизатора независимо, по крайней мере, без большой работы. И возиться с расписанием LR, как я это делал, тоже кажется беспорядочным.

Я что-то упускаю? Как люди там сохраняют / возобновляют использование этого API?

Комментарии:

1. Вы правы, нет встроенной поддержки API для возможности возобновления — это именно то, что побудило меня сделать свой собственный . Должен быть выпущен в течение нескольких недель.

2. Я считаю, что при использовании model.save можно использовать пользовательские показатели благодаря параметру custom_objects функции load_model. Я чувствую, что график скорости обучения может быть довольно легко реализован вручную, как вы сказали, или даже просто путем определения длины вывода модели. установите, а затем выполните некоторые вычисления, чтобы скорректировать результаты при следующем вызове функции.

3. @Arkleseisure RE: метрики — похоже, что использование custom_objects должно работать, но, к сожалению, это не так. custom_objects не поддерживает metrics atm.

4. Приношу свои извинения, я знал, что это работает для функций потерь, и допустил ошибку, предположив, что это будет работать для показателей.

Ответ №1:

tf.keras.callbacks.experimental.BackupAndRestore API для возобновления обучения из прерываний был добавлен для tensorflow>=2.3 . По моему опыту, это отлично работает.

Ссылка:https://www.tensorflow.org/api_docs/python/tf/keras/callbacks/experimental/BackupAndRestore

Ответ №2:

Вы правы, нет встроенной поддержки возможности возобновления — именно это побудило меня создать DeepTrain. Это как Pytorch Lightning (лучше и хуже в разных отношениях) для TensorFlow / Keras.

Зачем другая библиотека? Разве у нас недостаточно? У вас нет ничего подобного; если бы это было, я бы не создавал это. DeepTrain разработан с учетом «подхода няни» к обучению: обучайте меньше моделей, но тренируйте их тщательно. Внимательно следите за каждым этапом, чтобы определить, что не так и как исправить.

Вдохновение пришло от моего собственного использования; Я видел «всплески проверки» на протяжении долгой эпохи и не мог позволить себе сделать паузу, поскольку это перезапустило бы эпоху или иным образом нарушило цикл обучения. И забудьте о том, какую партию вы подгоняли или сколько осталось.

Как это сравнить с Pytorch Lightning? Превосходная возобновляемость и самоанализ, а также уникальные утилиты для отладки train — но Lightning работает лучше в других отношениях. У меня есть подробное сравнение списков в работе, опубликую в течение недели.

Поддержка Pytorch приближается? Возможно. Если я убедлю команду разработчиков Lightning исправить свои недостатки по сравнению с DeepTrain, то нет — в противном случае, вероятно. Тем временем вы можете изучить галерею примеров.


Минимальный пример:

 from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from deeptrain import TrainGenerator, DataGenerator

ipt = Input((16,))
out = Dense(10, 'softmax')(ipt)
model = Model(ipt, out)
model.compile('adam', 'categorical_crossentropy')

dg  = DataGenerator(data_path="data/train", labels_path="data/train/labels.npy")
vdg = DataGenerator(data_path="data/val",   labels_path="data/val/labels.npy")
tg  = TrainGenerator(model, dg, vdg, epochs=3, logs_dir="logs/")

tg.train()
  

Вы можете KeyboardInterrupt в любое время проверить модель, состояние обучения, генератор данных — и возобновить.

Ответ №3:

tf.keras.обратные вызовы.BackupAndRestore может позаботиться об этом.

Ответ №4:

Просто используйте функцию обратного вызова как

 callback = tf.keras.callbacks.experimental.BackupAndRestore(
backup_dir="backup_directory")