Keras模型.fit详细格式化

17

我正在Jupyter笔记本中运行Keras model.fit(),如果verbose设置为1,则输出非常混乱:

    Train on 6400 samples, validate on 800 samples
    Epoch 1/200
    2080/6400 [========>.....................] - ETA: 39s - loss: 0.4383 - acc: 0.79 
    - ETA: 34s - loss: 0.3585 - acc: 0.84 - ETA: 33s - loss: 0.3712 - acc: 0.84 
    - ETA: 34s - loss: 0.3716 - acc: 0.84 - ETA: 33s - loss: 0.3675 - acc: 0.84 
    - ETA: 33s - loss: 0.3650 - acc: 0.84 - ETA: 34s - loss: 0.3759 - acc: 0.83 
    - ETA: 34s - loss: 0.3933 - acc: 0.82 - ETA: 34s - loss: 0.3985 - acc: 0.82 
    - ETA: 34s - loss: 0.4057 - acc: 0.82 - ETA: 33s - loss: 0.4071 - acc: 0.81 
    ....

正如您所看到的,ETA、损失和准确度输出一直在记录中追加,而不是替换第一行中原始的ETA/loss/acc值,就像进度条的工作方式一样。

我该如何修复它,以便每个epoch只显示1行进度条、ETA、损失和准确度?目前,随着训练的继续,我的单元格输出有大量这些行。

我正在Windows 10上运行Python 3.6.1,并使用以下模块版本:

jupyter                            1.0.0
jupyter-client                     5.0.1
jupyter-console                    5.1.0
jupyter-core                       4.3.0
jupyterthemes                      0.19.0
Keras                              2.2.0
Keras-Applications                 1.0.2
Keras-Preprocessing                1.0.1
tensorflow-gpu                     1.7.0

谢谢你。

3个回答

28
Took me a while to see this but I just added built-in support for keras in tqdm (version >= 4.41.0) so you could do:
from tqdm.keras import TqdmCallback
...
model.fit(..., verbose=0, callbacks=[TqdmCallback(verbose=2)])

这会关闭keras的进度(verbose=0),使用tqdm替代。对于回调函数,verbose=2表示一个独立的进度条用于epochs和batches。 1 表示完成后清除batch条。 0 表示仅显示epochs(从不显示batch条)。


2
这是一个优雅的解决方案。 - Karthik Arumugham
翻转棒极了 - 现在应该接受这个答案 - 谢谢@casper.dcl - jtlz2
1
@casper.dcl - 烦人的是,即使使用tqdm 4.4.1,现在也会出现“AttributeError:'TqdmCallback'对象没有'_implements_train_batch_hooks'属性”的错误。问题一定是在keras方面吧? - jtlz2
1
@jtlz2 请查看此处的解决方法:(https://github.com/tqdm/tqdm/issues/979#issuecomment-638064271)。 - EliadL
@EliadL 谢谢 - 我看到 casper.dcl 现在已经修复了! - jtlz2
1
是的,AttributeError: _implements_train_batch_hooks 已在 tqdm>=4.46.1 中得到修复。 - casper.dcl

22
你可以尝试使用适用于Keras的TQDM进度条库。
原版TQDM库:https://github.com/tqdm/tqdm Keras版本的TQDM:https://github.com/bstriner/keras-tqdm 使用说明如下:
1. 安装,例如:`pip install keras-tqdm`(稳定版)或 `pip install git+https://github.com/bstriner/keras-tqdm.git`(最新开发版)。 2. 导入回调函数,使用方法 `from keras_tqdm import TQDMNotebookCallback`。 3. 运行Keras的 `fit` 或 `fit_generator`,设置 `verbose=0` 或 `verbose=2`,并添加导入的 `TQDMNotebookCallback` 回调函数,例如:`model.fit(X_train, Y_train, verbose=0, callbacks=[TQDMNotebookCallback()])`。
结果如下图所示:enter image description here

我注意到在许多Keras Jupyter笔记本中,它们保存的model.fit()输出日志仅显示每个时期的一个输出行,例如loss、acc等,即使它们没有导入keras_tqdm,只是导入tqdm_notebook。这是否意味着在某些版本的Keras / Jupyter中,这个问题不存在?输出似乎也更基于文本,例如"6400/6400 [==============================] - 53s 8ms/step - loss: 0.5435 - acc: 0.7451 - val_loss: 0.4689 - val_acc: 0.7468"。 - Mongrel Jedi

0

可以编写自己的自定义训练回调函数,例如:

class train_print_cb(keras.callbacks.Callback):

    def on_epoch_end(self, epoch, logs=None):
        keys = list(logs.keys())
        watch = keys[0] ## watching the first key, usually the loss         
        print(f'epoch {epoch} {watch}: {logs[watch]:.3f}          ', end = '\r')


model.fit(...verbose = 0, callbacks=[train_print_cb()])

请注意 on_epoch_end 函数中的 print 参数 end = '\r'。这意味着在终端和 Jupyter 笔记本上,状态行(epoch 数和监视值)在新状态可用时被覆盖。我个人觉得这很方便。
有关自定义回调的更多信息,请参见:https://www.tensorflow.org/guide/keras/custom_callback

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接