Flask调用TensorFlow模型predict时报eager/graph模式不兼容错误如何解决
问题原因
该报错是TensorFlow 1.x和2.x版本特性混用导致的不兼容问题:
TensorFlow 2.x默认开启eager执行模式,你加载的模型本身是eager模式下构造的,但预测代码里使用了TensorFlow 1.x专属的session+graph.as_default()写法,强制把预测逻辑切到了图模式下执行,两种模式冲突触发了报错。你之前设置的model.run_eagerly = True未生效,是因为外层的graph上下文强制覆盖了该参数的作用。
修复方案
- 方案1(优先尝试):移除TF1.x风格的session/graph上下文代码
TensorFlow 2.x不需要手动管理session和graph,直接删除预测代码里的两层with上下文即可,修改后代码如下:
image = np.expand_dims(_image, axis=0) pr_mask = model.predict(image).round() # b,g,r = cv2.split(_image) r,g,b = cv2.split(_image) rgb_img = cv2.merge([r,g,b]) print('success predict')
- 方案2:保证模型加载和预测在同一个graph上下文中
如果你的项目必须保留session相关逻辑,要保证加载模型和执行预测使用同一个graph,在加载模型时就套入对应的上下文:
import tensorflow as tf graph = tf.Graph() session = tf.compat.v1.Session(graph=graph) # 加载模型时就放入graph上下文 with graph.as_default(): with session.as_default(): # 替换为你实际的模型加载逻辑 model = tf.keras.models.load_model("your_model_path.h5")
预测时保留原有的session、graph上下文写法即可。
- 方案3:替换predict调用为直接模型调用
TensorFlow 2.x中模型实例可直接作为函数调用,走eager执行逻辑,不会触发图模式检查,替换写法如下:
image = np.expand_dims(_image, axis=0) with session.as_default(): with session.graph.as_default(): # 替换predict为直接调用模型,再转numpy数组后取整 pr_mask = model(image).numpy().round()
内容的提问来源于stack exchange,提问作者uzrsa
相关产品推荐
相关产品推荐

