В Python я перехожу от цикла Model.fit
Кераса к циклу Model.train_on_batch
для более точного контроля. Но индикатор выполнения и объект History, возвращаемый fit
, полезны. Прежде чем тратить время на их реализацию с нуля, мне было интересно, нашел ли кто-нибудь пример кода с использованием train_on_batch
, который воспроизводил индикатор выполнения и историю?
(Примечание. Я просмотрел исходный код для fit
, но там достаточно уровней косвенности, так что не так просто понять, что именно он делает. Также нашел это, которое полезно, но не имеет соответствующий функционал.)
@CeliusStingher В fit
есть один, который вызывает отображение индикатора выполнения. Ничего подобного в train_on_batch
нет.
Хм. Похоже, что функция прогресса/истории настроена на tensorflow.org/api_docs/python/tf/keras/callbacks/CallbackList .
Вы можете просто использовать tf.print('.', end='')
после каждого Model.train_on_batch
, чтобы показать прогресс, а в конце каждой эпохи распечатать необходимую информацию (например, потери или градиенты).
@Mr.ForExample Я мог бы, но это полностью заполнило бы экран. Встроенный индикатор выполнения хорошо работает в блокноте Jupyter. И у объекта истории есть много полезных методов. Не поймите меня неправильно, все можно переделать. Но это изобретение велосипеда...
@Mohan, подождите минутку, я просто смотрю на исходный код в течение нескольких минут, разве tf.keras.callbacks.ProgbarLogger не то, что вам нужно?
Поэтому, просмотрев исходный код keras, я обнаружил, что tf.keras.callbacks.ProgbarLogger и tf.keras.callbacks.History — это то, что вам нужно.
Исходный код
Это грязно. У меня сложилось впечатление, что эти классы на самом деле не предназначены для непосредственного использования. (Я использую функциональность CallbackList, о которой я упоминал, чтобы создать эти два объекта, а не делать это напрямую, но я не думаю, что это является причиной.) Тем не менее, спасибо за помощь. Я бы больше не беспокоился об этом. Я буду править, пока не заработает + опубликую полный пример кода. Я просто хотел проверить, что кто-то еще не сделал этого где-то...
Чтобы расширить этот «грязный» комментарий, есть различные недокументированные gubbins. Например. эпохи имеют нулевой индекс в коде, но 1-индексированный в печатном выводе, и вывод очень сбивает с толку, если вы передаете эпохи с 1-индексированным.
Определив EPOCHS
, train_generator
и проверочные данные val_x, val_y
, вы можете заменить
history = model.fit(train_generator, validation_data = (val_x, val_y), epochs = EPOCHS)
со следующим кодом:
callbacks = tf.keras.callbacks.CallbackList(
None,
add_history = True,
add_progbar = True,
model = model,
epochs = EPOCHS,
verbose = 1,
steps = len(train_generator)
)
callbacks.on_train_begin()
for epoch in range(EPOCHS):
model.reset_metrics()
callbacks.on_epoch_begin(epoch)
for i in range(len(train_generator)):
callbacks.on_train_batch_begin(i)
logs = model.train_on_batch(*train_generator[i], reset_metrics = False, return_dict = True)
callbacks.on_train_batch_end(i, logs)
validation_logs = model.evaluate(val_x, val_y, callbacks = callbacks, return_dict = True)
logs.update({'val_' + name: v for name, v in validation_logs.items()})
callbacks.on_epoch_end(epoch, logs)
train_generator.on_epoch_end()
callbacks.on_train_end(epoch_logs)
history = model.history
Да, можно также использовать tf.keras.callbacks.CallbackList
напрямую, я должен был упомянуть об этом, прежде чем лечь спать прошлой ночью, в любом случае, с этого момента это больше ни для кого не должно быть проблемой :) ура
Удивительно, однако, откуда взялась переменная "epoch_logs"?
Разве параметр
verbose
не может быть установлен на 1?