在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表示不输出日志到stdout,1表示显示进度条,2表示每epoch输出一行日志

输出将会是这样的:

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

如果你想显示epoch完成的进度条,保持verbose=0(这会关闭stdout的日志输出),并按以下方式实现:

from time import sleepimport sysepochs = 10for 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)    # 打印损失和准确率    # 你想要的精确输出:    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_utilsprogbar = 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)])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注