TensorFlow2.6+Keras设置25轮训练仅跑5轮问题排查
TensorFlow 2.6 训练未跑满设定Epoch的排查与修复
训练未按设定跑完25轮的问题按以下优先级排查修复:
- 优先排查硬编码steps参数与数据集规模不匹配问题
这是2.6版本下最高发的诱因:你当前使用tf.keras.utils.image_dataset_from_directory生成的是tf.data.Dataset对象,这类数据集默认迭代完所有批次就会终止,不会自动循环。你代码里硬编码了steps_per_epoch=25、validation_steps=25,如果拆分后的训练集/验证集实际总批次数小于你硬编码的数值,框架会在数据集耗尽后直接结束训练,不会继续跑满设定的25轮。
另外你的代码里定义了ImageDataGenerator但完全没有调用,当前训练根本没用到这个生成器,不要混淆旧版flow_from_directory的迭代逻辑和新版image_dataset_from_directory的逻辑。
修复方式:直接删除额外注意:你代码中定义的
train_datagen、test_datagen没有被实际调用,当前读取的图片像素值没有做1/255归一化,就算训练流程修复,模型收敛效果也会受影响,可以给数据集加map操作完成归一化:def rescale(image, label): return image/255.0, label train_generator = train_generator.map(rescale) validation_generator = validation_generator.map(rescale)model.fit中的steps_per_epoch和validation_steps参数,让框架自动根据数据集总样本量、batch_size计算每轮步数即可,修改后的fit代码如下:
如果必须手动指定步数,先通过以下代码获取数据集实际批次数,设定值不要超过这个结果:history = model.fit( train_generator, epochs = 25, validation_data = validation_generator, verbose = 1 )
问题复现时的运行参考:import tensorflow as tf train_batch_count = tf.data.experimental.cardinality(train_generator).numpy() val_batch_count = tf.data.experimental.cardinality(validation_generator).numpy()
- 排查被日志隐藏的运行时报错
你当前配置了日志屏蔽规则,把TensorFlow低级别日志全部过滤了,训练到第5轮时如果触发OOM内存溢出、损坏图片读取失败、数据格式异常的问题,可能因为提示信息级别不够被隐藏,看起来像是“无理由停止”。临时注释掉日志配置再复现一次,就能看到完整报错信息:# 临时注释以下代码,复现问题查看完整输出 # import logging # logging.getLogger("tensorflow").setLevel(logging.ERROR) - 排查隐式早停回调
你贴出的代码里没有添加EarlyStopping早停回调,但要排查是否有其他导入的依赖、全局配置默认注入了回调规则,可以在调用fit前执行print(model.callbacks),打印所有绑定到模型的回调,确认没有意外的早停规则触发训练终止。 - 校验框架版本安装正确性
你贴出的安装命令在包名和版本号之间加了多余空格,可能导致安装到不兼容的混合版本。执行以下命令重新安装干净的2.6版本:
安装完成后执行以下代码校验版本,确保两个框架版本都是2.6.0:pip uninstall -y tensorflow keras pip install tensorflow==2.6.0 keras==2.6.0import tensorflow as tf import keras print(tf.__version__, keras.__version__) - 排查数据集文件完整性
如果训练到第5轮时刚好读取到损坏、格式不支持的图片文件,也会导致训练终止,可以遍历全量数据集文件排查坏图,尤其是第5轮对应批次的图片文件。
内容的提问来源于stack exchange,提问作者Elizabeth Grant
相关产品推荐
相关产品推荐

