当我调用model.fit_generator()来训练我的模型时,输出中显示了训练进度,正如预期的那样。然而,它在达到最大值之前少了一步,然后就转到验证阶段。验证阶段显示的进度条与训练阶段相同,尽管验证步骤完全不同(大约70,000个训练步骤/8,000个验证步骤)。验证进度条在达到8,000步时停止,例如:
75999/76000 [===========================>..] - ETA: 0s - loss: 0.4556 - acc: 0.840Epoch 1/5008200/76000 [====>........................] - ETA: 0s - loss: 0.9822 - acc: 0.7564
第一行是训练,第二行是验证。
当我手动更改步骤,使训练步骤少于验证步骤时,我得到了以下输出:
19/20 [===========================>..] - ETA: 0s - loss: 0.4558 - acc: 0.8980Epoch 1/50019/20 [===========================>..] - ETA: 0s - loss: 0.8200 - acc: 0.7730
它在这个输出上暂停,而其余的验证步骤继续进行。其余验证步骤的输出并未在进度条中显示。
当验证步骤和训练步骤由我的生成器生成,或如上所述手动设置时,都会出现这个错误,所以我认为问题不在于我的生成器。我的fit_generator()调用如下(使用.fit()时也相同):
model.fit_generator( train_generator, steps_per_epoch=train_steps, epochs=epochs, validation_data=val_generator, validation_steps=val_steps, verbose=1, callbacks=[weight_saving_callback,early_stopping], max_queue_size=40, workers=1, use_multiprocessing=False, #train_class_weight=None, #因为我们不使用目标类别 #val_class_weight=None, #因为我们不使用目标类别 validation_freq=1)
有谁能看出这个错误在哪里吗?我认为这不会影响训练过程,只是输出的问题 – 但我找不出问题出在哪里。使用的是TensorFlow 2.1和Keras 2.3.1。
简单来说:为什么验证进度条不显示正确的验证步骤数?
回答:
我的经验是,如果你试图在epoch结束时打印出自己的信息,会弄乱TensorFlow的输出。我最终采取的做法是,为我想打印出的项目创建类变量,并将它们传递给on_epoch_begin函数,然后在那里打印信息。这似乎不会弄乱epoch结束时TensorFlow的输出。