Keras: есть ли пример кода для train_on_batch, в котором есть история + прогресс?

В Python я перехожу от цикла Model.fit Кераса к циклу Model.train_on_batch для более точного контроля. Но индикатор выполнения и объект History, возвращаемый fit, полезны. Прежде чем тратить время на их реализацию с нуля, мне было интересно, нашел ли кто-нибудь пример кода с использованием train_on_batch, который воспроизводил индикатор выполнения и историю?

(Примечание. Я просмотрел исходный код для fit, но там достаточно уровней косвенности, так что не так просто понять, что именно он делает. Также нашел это, которое полезно, но не имеет соответствующий функционал.)

Разве параметр verbose не может быть установлен на 1?

Celius Stingher 11.12.2020 15:37

@CeliusStingher В fit есть один, который вызывает отображение индикатора выполнения. Ничего подобного в train_on_batch нет.

Mohan 11.12.2020 15:47

Хм. Похоже, что функция прогресса/истории настроена на tensorflow.org/api_docs/python/tf/keras/callbacks/CallbackLi‌​st .

Mohan 11.12.2020 15:51

Вы можете просто использовать tf.print('.', end='') после каждого Model.train_on_batch, чтобы показать прогресс, а в конце каждой эпохи распечатать необходимую информацию (например, потери или градиенты).

Mr. For Example 11.12.2020 15:59

@Mr.ForExample Я мог бы, но это полностью заполнило бы экран. Встроенный индикатор выполнения хорошо работает в блокноте Jupyter. И у объекта истории есть много полезных методов. Не поймите меня неправильно, все можно переделать. Но это изобретение велосипеда...

Mohan 11.12.2020 16:24

@Mohan, подождите минутку, я просто смотрю на исходный код в течение нескольких минут, разве tf.keras.callbacks.ProgbarLogger не то, что вам нужно?

Mr. For Example 11.12.2020 16:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
1 254
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поэтому, просмотрев исходный код keras, я обнаружил, что tf.keras.callbacks.ProgbarLogger и tf.keras.callbacks.History — это то, что вам нужно.

Исходный код

keras/callbacks.py#L259

keras/callbacks.py#L263

Это грязно. У меня сложилось впечатление, что эти классы на самом деле не предназначены для непосредственного использования. (Я использую функциональность CallbackList, о которой я упоминал, чтобы создать эти два объекта, а не делать это напрямую, но я не думаю, что это является причиной.) Тем не менее, спасибо за помощь. Я бы больше не беспокоился об этом. Я буду править, пока не заработает + опубликую полный пример кода. Я просто хотел проверить, что кто-то еще не сделал этого где-то...

Mohan 11.12.2020 23:57

Чтобы расширить этот «грязный» комментарий, есть различные недокументированные gubbins. Например. эпохи имеют нулевой индекс в коде, но 1-индексированный в печатном выводе, и вывод очень сбивает с толку, если вы передаете эпохи с 1-индексированным.

Mohan 12.12.2020 00:05
Ответ принят как подходящий

Определив 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 напрямую, я должен был упомянуть об этом, прежде чем лечь спать прошлой ночью, в любом случае, с этого момента это больше ни для кого не должно быть проблемой :) ура

Mr. For Example 12.12.2020 11:47

Удивительно, однако, откуда взялась переменная "epoch_logs"?

Preto 21.10.2022 11:52

Другие вопросы по теме