TensorFlow训练后GeneratorDataset迭代器终止报错求助
解决TensorFlow训练后GeneratorDataset iterator取消警告的问题
嘿,先给你吃颗定心丸:你的水果分类模型已经成功完成训练啦!从运行日志能看到训练全量步数跑完,训练精度0.86、验证精度接近100%,而且进程最后是正常退出的(Process finished with exit code 0)。那个让你困惑的警告只是TensorFlow内部资源清理时的小插曲,完全没影响模型训练的结果。
警告原因分析
这个Error occurred when finalizing GeneratorDataset iterator: Cancelled: Operation was cancelled警告,本质是TensorFlow训练结束后的线程同步小问题:
- 你设置了
workers=10启用多线程加载数据,当训练完成后主线程会提前终止部分仍在运行的子线程,导致迭代器的关闭操作被取消,从而抛出这个警告。 - 这是你使用的旧版TensorFlow(2020年的版本)的已知小bug,不影响模型的训练、保存和后续使用。
消除警告的解决方法
你可以尝试下面几种方案让这个警告消失:
1. 调整多线程数量
减少fit()中的workers参数值,避免过多线程引发资源竞争:
fruit_model = model.fit(train_gen, epochs=1, verbose=1, validation_data=val_gen, workers=4) # 也可以尝试workers=1的单线程模式,彻底避免线程同步问题
2. 训练后手动关闭生成器
在训练完成后,显式调用生成器的close()方法,帮助TensorFlow正确释放资源:
fruit_model = model.fit(train_gen, epochs=1, verbose=1, validation_data=val_gen, workers=10) # 训练结束后手动关闭数据生成器 train_gen.close() val_gen.close()
3. 升级TensorFlow版本
这个迭代器关闭的问题在TensorFlow 2.5及以后的版本中已经被官方修复。如果你的环境允许,可以升级到较新的稳定版本:
pip install --upgrade tensorflow
代码小瑕疵提醒
另外我注意到一个小细节:你创建验证集生成器时,不小心用了training_datagen而不是定义好的validation_datagen:
# 当前代码 val_gen = training_datagen.flow_from_directory(val_dir, target_size=(150, 150), class_mode="categorical") # 建议修正为 val_gen = validation_datagen.flow_from_directory(val_dir, target_size=(150, 150), class_mode="categorical")
不过因为两个生成器都只做归一化处理,这个小问题不会影响模型功能,只是代码逻辑上更严谨的话建议修正。
内容的提问来源于stack exchange,提问作者Rick Astley




