我试图从我的Keras (tensorflow后端)模型创建pb文件,这样我就可以在iOS上构建它。我使用的是freeze.py,我需要传递输出节点。如何获得Keras模型的输出节点的名称?
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py您可以使用Keras model.summary()来获取最后一层的名称。
如果模型。输出不为空,您可以通过以下命令获取节点名称:
[node.op.name for node in model.outputs]
你通过
获得会话session = keras.backend.get_session()
,然后通过
将所有训练变量转换为constmin_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)
如果在Keras中构造模型时没有显式指定输出节点,则可以像这样将它们打印出来:
[print(n.name) for n in tf.get_default_graph().as_graph_def().node]
那么你所需要做的就是找到一个合适的,它通常与激活函数的名称相似。
freeze_graph
函数中output_node_names
的值。您还可以使用tensorflow实用程序:summarize_graph
来查找可能的output_nodes
。来自官方文档:
工具支持的许多转换需要知道模型的输入和输出层是什么。最好的来源是模型训练过程,其中对于分类器来说,输入将是从训练集接收数据的节点,输出将是预测。如果您不确定,summarize_graph工具可以检查模型,并提供关于可能的输入和输出节点的猜测,以及对调试有用的其他信息。
它只需要保存的图形pb
文件作为输入。查看文档以获取示例。
output_node_names
应该包含您打算用于推理的图节点的名称(例如;softmax)。它用于提取推理所需的子图。查看freeze_graph_test可能会有用。