You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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总数
  • 里面的lossacc是整个训练epoch的平均损失与准确率
  • 末尾的val_lossval_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

火山引擎 最新活动