我正在尝试从我的Keras(tensorflow后端)模型创建一个pb文件,以便我可以在iOS上构建它。我使用的是freeze.py,我需要传递输出节点。如何获取Keras模型的输出节点名称?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py
答案 0 :(得分:16)
您可以使用Keras model.summary()获取最后一层的名称。
如果model.outputs不为空,您可以通过以下方式获取节点名称:
[node.op.name for node in model.outputs]
你通过
获得会话session = keras.backend.get_session()
并通过
将所有训练变量转换为constsmin_graph = convert_variables_to_constants(session, session.graph_def, [node.op.name for node in model.outputs])
之后你可以通过
编写一个protobuf文件tensorflow.train.write_graph(min_graph, "/logdir/", "file.pb", as_text=True)
答案 1 :(得分:11)
如果在Keras中构建模型时未明确指定输出节点,则可以像这样打印出来:
[print(n.name) for n in tf.get_default_graph().as_graph_def().node]
然后你需要做的就是找到合适的,通常类似于激活功能的名称。您可以在output_node_names
函数中使用此freeze_graph
的值作为{{1}}的值。
答案 2 :(得分:4)
您还可以使用tensorflow实用程序:summarize_graph
查找可能的output_nodes
。来自official documentation:
该工具支持的许多变换需要知道模型的输入和输出层是什么。这些的最佳来源是模型训练过程,对于分类器,输入将是从训练集接收数据的节点,输出将是预测。如果您不确定,summarize_graph工具可以检查模型并提供有关可能的输入和输出节点的猜测,以及其他对调试有用的信息。
只需要保存的图形pb
文件作为输入。查看文档以获取示例。
答案 3 :(得分:2)
output_node_names
应包含您打算用于推理的图形节点的名称(例如softmax)。它用于提取推理所需的sub-graph。
查看freeze_graph_test可能很有用。