TensorFlow与Keras环境中.py文件终端运行报错咨询(ipynb正常)
解决TensorFlow 2.3.0终端运行.py脚本出现的
_CheckpointRestoreCoordinatorDeleter.__del__ TypeError 这个问题我之前碰到过,本质是TensorFlow 2.3.0的一个已知垃圾回收bug:当终端里的.py脚本运行结束时,Python的垃圾回收机制会触发_CheckpointRestoreCoordinatorDeleter的__del__方法,但此时相关的TF内部对象已经被销毁,导致调用了一个NoneType的对象,从而抛出这个被忽略的异常。而Jupyter Lab的交互式会话会维持TF上下文的状态,垃圾回收的时机和独立脚本不同,所以不会触发这个问题。
下面是几个针对性的解决办法,按推荐程度排序:
1. 升级TensorFlow版本(最推荐)
这个bug在TensorFlow 2.4.0及以上版本已经被官方修复,而且Keras 2.4.3正好和TensorFlow 2.4.x系列兼容(Keras 2.4.3是TF 2.4的配套版本)。你可以直接升级到GPU版本的TF 2.4.0:
pip install tensorflow-gpu==2.4.0 --upgrade
升级后这个异常会直接消失,同时还能获得TF后续版本的性能优化和bug修复。
2. 手动控制垃圾回收时机
如果暂时不想升级版本,可以在脚本训练完成后,手动触发垃圾回收,强制清理TF相关对象,避免脚本结束时的无序回收:
import gc # 你的训练代码... model.fit(...) # 训练结束后手动清理 gc.collect()
如果你的代码里显式使用了tf.train.Checkpoint或ModelCheckpoint回调,也可以先删除这些对象再触发回收:
del checkpoint # 替换成你实际的检查点对象名 del model_checkpoint_callback # 替换成你的回调对象名 gc.collect()
3. 抑制特定异常(治标不治本)
这个异常本身是“被忽略”的(Exception ignored),不会影响你的训练结果,只是终端输出看起来烦人。如果只是想屏蔽这个错误,可以在脚本开头添加以下代码,专门拦截这个特定的TypeError:
import sys from types import TracebackType def ignore_checkpoint_del_error(exctype: type, value: Exception, traceback: TracebackType) -> None: # 只拦截_CheckpointRestoreCoordinatorDeleter.__del__的NoneType调用错误 if (exctype is TypeError and "'NoneType' object is not callable" in str(value) and "_CheckpointRestoreCoordinatorDeleter.__del__" in str(traceback)): return # 其他异常正常处理 sys.__excepthook__(exctype, value, traceback) sys.excepthook = ignore_checkpoint_del_error
内容的提问来源于stack exchange,提问作者Stupid420
相关产品推荐
相关产品推荐

