Python 在Keras分批培训期间显示每个历元的进度条

Python 在Keras分批培训期间显示每个历元的进度条,python,machine-learning,keras,Python,Machine Learning,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,

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

model.fit(X, y, nb_epoch=40, batch_size=32, validation_split=0.2, verbose=1)
在上面更改为
verbose=2
的过程中,正如文档中所述:“verbose:0表示不记录到标准输出,1表示进度条记录,
2表示每个历元一个日志行

它会将您的输出显示为:

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
.....
.....
二,

如果要显示完成历元的进度条,请保持
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个纪元

三,

如果要在每n批之后显示损失,可以使用:

out_batch = NBatchLogger(display=1000)
model.fit([X_train_aux,X_train_main],Y_train,batch_size=128,callbacks=[out_batch])
不过,我以前从未试过。上述示例摘自keras github发行版:

您还可以在此处观看
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)])

您可以设置verbose=0,并设置回调,以在每次拟合结束时更新进度

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

或set callback(设置回调)

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

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

这将关闭
keras
”进度(
verbose=0
),并使用
tqdm
。对于回调,
verbose=2
意味着为历元和批处理提供单独的进度条<代码>1表示完成后清除批次栏<代码>0表示只显示年代(从不显示批次栏)。

这里有一个答案+1
model.fit(…,verbose=0,callbacks=[TqdmCallback(verbose=0)])
在进行大量历次(几十次或数百次)培训时提供最佳输出。这应该是默认值(verbose=0)!