#python #tensorflow #keras #tensorflow2.0 #tf.keras
#python #тензорный поток #keras #tensorflow2.0 #tf.keras
Вопрос:
После долгих исследований кажется, что нет хорошего способа правильно остановить и возобновить обучение с использованием модели Tensorflow 2 / Keras. Это верно независимо от того, используете ли вы model.fit()
или пользовательский цикл обучения.
Кажется, существует 2 поддерживаемых способа сохранения модели во время обучения:
-
Сохраните только веса модели, используя
model.save_weights()
илиsave_weights_only=True
сtf.keras.callbacks.ModelCheckpoint
. Похоже, это предпочтительнее большинства примеров, которые я видел, однако у этого есть ряд серьезных проблем:- Состояние оптимизатора не сохраняется, что означает, что возобновление обучения не будет корректным.
- График скорости обучения сбрасывается — это может привести к катастрофическим последствиям для некоторых моделей.
- Журналы Tensorboard возвращаются к шагу 0, что делает ведение журнала по существу бесполезным, если не будут реализованы сложные обходные пути.
-
Сохраните всю модель, оптимизатор и т.д. с помощью
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")