You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow冻结图报错:output节点不在图中,Keras转.pb文件失败

解决Keras模型导出为.pb文件时"output is not in graph"的错误

这是Keras+TensorFlow后端导出模型时很常见的问题——虽然你给最后一层Dense命名了output,但TensorFlow实际生成的计算图里,真正的输出节点名称并不是直接的output。原因是Keras会把带激活函数的层拆分成多个TensorFlow节点:比如你的Dense层会先生成一个计算线性输出的节点(比如output/BiasAdd),再单独生成一个Softmax激活节点(比如output/Softmax),而模型的输出其实对应这个激活节点的张量。

下面是具体的解决步骤:

1. 找到真实的输出节点名称

先运行这段代码,打印出当前计算图里所有节点的名称,定位到和output相关的最终输出节点:

from tensorflow.keras import backend as K

# 获取当前会话的计算图
graph = K.get_session().graph
for node in graph.as_graph_def().node:
    print(node.name)

你会看到类似output/Softmax这样的节点名称,这就是你需要传入冻结函数的正确输出节点名。

2. 修改冻结图的参数

找到正确节点名后,把你调用export_model时的最后一个参数从"output"替换成这个真实名称。

更省心的方式是直接从模型中自动获取输出节点名,避免手动查找出错:

# 直接获取模型输出对应的节点名称
output_node_name = model.output.op.name
# 传入export_model函数
export_model(tf.train.Saver(), model, ["conv2d_1_input"], output_node_name)

这种方式会自动匹配Keras生成的真实节点,不用关心层的内部拆分逻辑。

3. 额外小提示

如果你使用的是TensorFlow 2.x版本,其实可以用更简洁的方式导出模型:

# 先保存为标准SavedModel格式
model.save("my_saved_model")
# Android现在也支持直接加载SavedModel,或者你再转换为冻结图也可以

不过针对你当前用的TF1.x冻结图流程,上面的方法已经能完美解决问题。

内容的提问来源于stack exchange,提问作者JustANoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:30