将pb模型文件加载到TensorFlowSharp中

时间:2018-05-15 10:28:48

标签: c# tensorflow keras tensorflowsharp

我有一些Keras经验并且正在学习TensorFlowSharp(https://github.com/migueldeicaza/TensorFlowSharp)。使用ExampleInceptionInference项目,我想使用我在Keras python代码中训练的模型。

(我在这里使用@jdehesa回复创建了一个.pb文件:How to export Keras .h5 to tensorflow .pb?

当我在TensorFlowSharp中加载.pb模型文件时,此行失败:

runner.AddInput (graph ["input"] [0], tensor).Fetch (graph ["output"] [0]);

图表["input"]和图表["output"]似乎都是空的。 我是否需要在模型中命名图层?

我使用的Keras模型是VGG16的经过修改和重新训练的版本。

是否可以在TensorFlowSharp中输出命名图层列表?或者是否可以通过其他方式引用它们? (按号码?)

3 个答案:

答案 0 :(得分:3)

TFGraph的GetEnumerator()方法允许您枚举所有操作。

List<TFOperation> op_list = new List<TFOperation>( graph.GetEnumerator() );

您可以检查TFOperation名称和OpType来查看图中的内容。

答案 1 :(得分:2)

我在TensorFlowSharp中遇到了同样的问题。查找输入和输出名称的最简单方法是将模型加载到Netron(https://github.com/lutzroeder/netron)中,该工具可以直观地显示模型。您可以单击第一个节点以查看输入的“ id:”和最后一个节点的“ name”属性。

答案 2 :(得分:0)

最后,我找到了解决此问题的两种方法。一种是在HxD中查看pb文件,然后在其中找到层的名称。输入层很容易在文件顶部找到:

HxD view of the pd file

更难找到输出层。但是解决此问题的方法2是命名图层:

outputlayer.name = "output"

但是,在加载图层时,名称略有不同,并且包括激活类型。在这种情况下,它的“输出/ Softmax”也可以在pb文件的二进制文件中找到。