[英]Show progress bar for each epoch during batchwise training in 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)
這將為每個批次而不是每個時期生成一個進度條。 是否可以在批量訓練期間為每個 epoch 生成進度條?
model.fit(X, y, nb_epoch=40, batch_size=32, validation_split=0.2, verbose=1)
在上面對verbose=2
更改中,如文檔中所述:
詳細: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
(關閉記錄到標准輸出)並按以下方式實施:
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 問題: Show Loss Every N Batches #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
進行進度,但它會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
(版本 >= 4.41.0)還剛剛添加了對keras
內置支持,因此您可以執行以下操作:
from tqdm.keras import TqdmCallback
...
model.fit(..., verbose=0, callbacks=[TqdmCallback(verbose=2)])
這會關閉keras
的進度( verbose=0
),並使用tqdm
代替。 對於回調, verbose=2
表示 epochs 和 batches 的單獨進度條。 1
表示完成后清除批處理條。 0
表示只顯示紀元(從不顯示批次條)。
您可以設置 verbose=0 並設置回調,以在每次擬合結束時更新進度,
clf.fit(X, y, nb_epoch=1, batch_size=data.batch_size, verbose=0, callbacks=[some_callback])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.