在Keras中分批训练期间显示每个时期的进度条

发布于 2021-01-29 15:07:31

当我将整个数据集加载到内存中并使用以下代码在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)

这将为每个批次而不是每个时期生成一个进度条。在分批训练期间是否可以为每个时期生成进度条?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    1。

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

    在上述对的更改中verbose=2,如文档中所述:“详细: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问题:Show Loss N N
    Batchs#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))
    

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看