在Keras中批量训练时显示每个epoch的进度条



当我在内存中加载整个数据集并使用以下代码在Keras中训练网络时:

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

这会在每个epoch生成一个进度条,其中包含诸如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)

这将为每个批生成进度条,而不是每个epoch。是否有可能在批处理训练期间为每个epoch生成进度条?

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

在上面对verbose=2的更改中,正如文档中提到的:

verbose: 0表示不记录标准输出,1表示记录进度条,2表示每个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
.....
.....
  • 如果您想要显示epoch完成的进度条,请保留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%, epoch 10
    
  • 如果您希望每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

    您也可以在这里观看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))
    
  • 您也可以使用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)])
    

    tqdm (version>= 4.41.0)也刚刚添加了对keras的内置支持,因此您可以:

    from tqdm.keras import TqdmCallback
    ...
    model.fit(..., verbose=0, callbacks=[TqdmCallback(verbose=2)])
    

    关闭keras的进度(verbose=0),并使用tqdm代替。对于回调,verbose=2表示epoch和batch的单独进度条。1表示完成后清除批处理栏。0表示只显示epoch(从不显示batch bars)。

    您可以设置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

    相关内容

    • 没有找到相关文章

    最新更新