Показывать индикатор выполнения для каждой эпохи во время периодического обучения в Keras

Когда я загружаю весь набор данных в память и тренирую сеть в Keras, используя следующий код:

model.fit(X, y, nb_epoch=40, batch_size=32, validation_split=0.2, verbose=1)

Это генерирует индикатор выполнения в эпоху с такими метриками, как ETA, точность, потеря и т.д.

Когда я тренирую сеть партиями, я использую следующий код

for e in range(40):
        for X, y in data.next_batch():
            model.fit(X, y, nb_epoch=1, batch_size=data.batch_size, verbose=1)

Это создаст индикатор выполнения для каждой партии вместо каждой эпохи. Возможно ли создать индикатор выполнения для каждой эпохи во время периодического обучения?

Ответы

Ответ 1

1.

model.fit(X, y, nb_epoch=40, batch_size=32, validation_split=0.2, verbose=1)

В приведенном выше изменении на verbose=2, как указано в документации: "verbose: 0 для отсутствия входа в stdout, 1 для ведения журнала выполнения, 2 for one log line per epoch."

Он отобразит ваш результат как:

Epoch 1/100
0s - loss: 0.2506 - acc: 0.5750 - val_loss: 0.2501 - val_acc: 0.3750
Epoch 2/100
0s - loss: 0.2487 - acc: 0.6250 - val_loss: 0.2498 - val_acc: 0.6250
Epoch 3/100
0s - loss: 0.2495 - acc: 0.5750 - val_loss: 0.2496 - val_acc: 0.6250
.....
.....

2.

Если вы хотите показать индикатор выполнения для завершения эпох, сохраните verbose=0 (который отключает ведение журнала в stdout) и реализуйте следующим образом:

from time import sleep
import sys

epochs = 10

for e in range(epochs):
    sys.stdout.write('\r')

    for X, y in data.next_batch():
        model.fit(X, y, nb_epoch=1, batch_size=data.batch_size, verbose=0)

    # print loss and accuracy

    # the exact output you're looking for:
    sys.stdout.write("[%-60s] %d%%" % ('='*(60*(e+1)/10), (100*(e+1)/10)))
    sys.stdout.flush()
    sys.stdout.write(", epoch %d"% (e+1))
    sys.stdout.flush()

Выход будет следующим:

[============================================== =============== 100%, эпоха 10

3.

Если вы хотите показать потерю после каждого n партий, вы можете использовать:

out_batch = NBatchLogger(display=1000)
model.fit([X_train_aux,X_train_main],Y_train,batch_size=128,callbacks=[out_batch])

Хотя, я никогда не пробовал это раньше. Вышеприведенный пример был взят из этой проблемы keras github: Показать потерю каждого N партий # 2850

4.

Вы также можете использовать progbar для выполнения, но он будет печатать ход в пакетном режиме

from keras.utils import generic_utils

progbar = generic_utils.Progbar(X_train.shape[0])

for X_batch, Y_batch in datagen.flow(X_train, Y_train):
    loss, acc = model_test.train([X_batch]*2, Y_batch, accuracy=True)
    progbar.add(X_batch.shape[0], values=[("train loss", loss), ("acc", acc)])