PyCharm中调试Keras/TensorFlow自定义指标函数断点失效如何解决
问题根因
- TensorFlow默认会将
model.compile传入的自定义指标函数转为静态计算图执行,静态图模式下Python代码仅会被扫描一次生成TensorFlow内部可执行的算子流,后续model.fit运行时执行的是编译后的静态图,不是你写的原始Python代码,因此断点不会被触发。 - 你之前设置
run_eagerly = True未生效的核心原因是属性绑定错误:你给vgg_model开启了eager执行,但实际调用compile、fit的是另一个model实例,配置没有生效。 - 你原本遇到的Tensor转换错误同样和静态图模式有关:
tf.keras.backend.eval只能对eager模式下的tensor调用,静态图中的tensor没有实际数值,调用会直接报错。
解决方案
- 首先修正eager执行配置,直接给实际训练的模型开启eager执行:
可以直接在compile阶段配置:
也可以在compile后单独设置model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=[confusionMat,"accuracy"], run_eagerly=True)model.run_eagerly = True,确保配置绑定到实际运行的模型实例上。修改后重新运行model.fit,你设置的PyCharm断点就能正常触发。 - 如果修改后断点仍然不生效,可以临时在需要调试的位置插入硬断点代码,强制触发调试:
在你设置断点的multiConfusion调用行之前加入以下代码:
运行到该行时会强制暂停进入调试状态,PyCharm会自动识别捕获pdb断点。import pdb; pdb.set_trace() - 调试完成后建议优化指标实现:不要在指标函数中用
tf.keras.backend.eval将tensor转成numpy处理,这类操作会严重拖慢训练速度,建议直接用TensorFlow原生算子实现混淆矩阵计算,全程在计算图内完成操作不需要脱离图转数值,适配静态图模式也能正常运行。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

