web-dev-qa-db-ja.com

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)

これにより、各エポックではなく各バッチの進行状況バーが生成されます。バッチごとのトレーニング中に各エポックの進行状況バーを生成することは可能ですか?

32
Anish Shah

1。

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

上記のverbose=2への変更では、ドキュメントに記載されているように、「詳細:標準出力へのログ記録なしの場合は0、プログレスバーのログ記録の場合は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バッチごとに損失を表示#285

ここでNBatchLoggerのデモをフォローすることもできます:

class NBatchLogger(Callback):
    def __init__(self, display):
        self.seen = 0
        self.display = display

    def on_batch_end(self, batch, logs={}):
        self.seen += logs.get('size', 0)
        if self.seen % self.display == 0:
            metrics_log = ''
            for k in self.params['metrics']:
                if k in logs:
                    val = logs[k]
                    if abs(val) > 1e-3:
                        metrics_log += ' - %s: %.4f' % (k, val)
                    else:
                        metrics_log += ' - %s: %.4e' % (k, val)
            print('{}/{} ... {}'.format(self.seen,
                                        self.params['samples'],
                                        metrics_log))

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)])
49

verbose = 0を設定し、各フィッティングの終了時に進行状況を更新するコールバックを設定できます。

clf.fit(X, y, nb_Epoch=1, batch_size=data.batch_size, verbose=0, callbacks=[some_callback])

https://keras.io/callbacks/#example-model-checkpoints

またはコールバックを設定 https://keras.io/callbacks/#remotemonitor

1
quester