Keras带验证数据训练时多进度条与损失值的原因问询
为什么Keras训练时会出现两个进度条?
这是个很典型的版本兼容性细节问题,结合你用的Keras 2.2.4 + TensorFlow 1.13.1组合,我来帮你理清楚:
1. 双进度条的原因
在这个特定的版本组合中,当你同时满足两个条件时就会触发双进度条的显示:
- 训练数据用
ImageDataGenerator.flow()生成器传入 - 验证数据直接传入numpy数组形式的
(val_x, val_y),并且指定了validation_steps
Keras在处理这种验证数据时,会自动把numpy数组包装成一个临时生成器来迭代计算验证指标,而这个临时生成器默认会打印自己的迭代进度——也就是你看到的第一个进度条(比如153/153那行)。第二个进度条则是训练过程的主进度条,负责汇总训练epoch的平均指标,并附上验证集的最终计算结果。
2. 第一个示例中的第二个进度条是什么?
第二个进度条是训练过程的核心进度条:
- 它的
12/12对应你设置的steps_per_epoch=len(train_x)//BS,也就是每个epoch需要跑完的训练batch总数 - 里面的
loss和acc是整个训练epoch的平均损失与准确率 - 末尾的
val_loss和val_acc就是验证集计算得到的指标(和第一个进度条的数值接近,微小差异来自batch拆分或计算精度)
3. 为什么平时只看到一个进度条?
在较新的Keras版本(比如2.3.x及以上)或者TensorFlow 2.x对应的Keras实现中,官方优化了训练循环的显示逻辑:
- 会把训练和验证的进度合并到同一个主进度条里
- 训练进度完成后,直接在同一行末尾显示验证指标,不会单独打印验证集的进度条
解决双进度条的小技巧
如果你想在当前版本下只显示一个进度条,可以把验证数据也用ImageDataGenerator.flow()包装后传入:
history = model.fit( data.flow(train_x,train_y,batch_size=BS), steps_per_epoch=len(train_x)//BS, validation_data=data.flow(val_x, val_y, batch_size=BS), validation_steps=len(val_x)//BS, epochs=EPOCHS)
这样Keras会用统一的生成器逻辑处理训练和验证数据,就只会显示一个包含所有指标的进度条了。
内容的提问来源于stack exchange,提问作者LContini




