相同代码在TensorFlow1.15.0与2.3.0版本训练进度输出差异咨询
TensorFlow 1.15 额外进度条问题解答
额外进度条的本质
你观察到的两条额外进度条,分别对应单轮训练结束后的训练集指标全量计算流程、验证集评估流程,是TensorFlow 1.x版本内置Keras模块的默认输出逻辑导致的。
具体原因
- TensorFlow 1.15 内置的Keras版本为2.2.x/2.3.1,该版本下
model.fit()的进度条没有做阶段合并,训练迭代、训练集指标汇总、验证集评估三个阶段会各自输出独立的进度条。而TensorFlow 2.3.0对应的Keras版本已经完成了进度条逻辑优化,三个阶段的进度会合并到单条轮次进度条中,仅在进度条末尾更新验证指标,不会单独输出。 - 只要你的代码中配置了
validation_split参数或者传入了validation_data验证数据集,1.x版本的Keras就会在每轮训练跑完所有训练batch后,先全量遍历训练集计算本轮平均损失、准确率等汇总指标(第一条额外进度条),再全量遍历验证集计算验证指标(第二条额外进度条),两个流程各自独立输出进度。 - 两者的弃用警告、运行耗时差异属于版本迭代的正常表现:TensorFlow 1.15是1.x分支的最终稳定版,大量API在2.x版本中已经被重构替换,所以旧版本会输出大量弃用提示;同时2.x版本默认开启了图执行优化、Eager模式性能优化,相同代码的运行耗时会比1.15更短。
可选优化方案
如果要在TensorFlow 1.15中隐藏额外进度条,可以显式指定训练和验证的步数,同时调整进度条日志回调:
# 提前计算对应数据集的总步数,传入fit方法 train_steps = len(train_dataset) // batch_size val_steps = len(val_dataset) // batch_size # 配置进度条回调 from tensorflow.keras.callbacks import ProgbarLogger callbacks = [ProgbarLogger(count_mode='steps')] model.fit( ..., steps_per_epoch=train_steps, validation_steps=val_steps, callbacks=callbacks )
内容的提问来源于stack exchange,提问作者kvadrat
相关产品推荐
相关产品推荐

