TensorFlowInferenceInterface:imagenet的移动网络:java.io.IOException:不是有效的TensorFlow图形序列化

时间:2017-10-23 12:19:28

标签: android tensorflow

我正在尝试在Android Tensorflow上运行通过imagenet训练的mobilenet模型进行对象识别,并面对如下所述的问题。

 TensorFlowInferenceInterface: Failed to load model 
    from 'file:///android_asset/mobilenet_imagenet.pb': java.io.IOException: 
    Not a valid TensorFlow Graph serialization: 
    NodeDef mentions attr 'data_format' not in Op<name=DepthwiseConv2dNative;
    signature=input:T, filter:T -> output:T; 
    attr=T:type,allowed=[DT_FLOAT, DT_DOUBLE]; attr=strides:list(int); 
    attr=padding:string,allowed=["SAME", "VALID"]>; 
    NodeDef: conv_dw_1/depthwise = 
DepthwiseConv2dNative[T=DT_FLOAT, data_format="NHWC", padding="SAME", strides=[1, 1, 1, 1]]
    (conv1_relu/clip_by_value, conv_dw_1/depthwise_kernel/read)

我按照link中给出的教程在Android上集成了Tensorflow。我可以运行基本的CNN分类器自定义训练(使用python 2.7.12,Tensorflow 1.2在Ubuntu 16.04上),它工作正常。

我可以使用Tensorflow 1.2和1.3成功运行在Ubuntu 16.04上的python 2.7.12上通过imagenet训练的Mobilenet。现在,当我尝试运行相同的&#39; .pb&#39;在Android上的模型它给了我上面提到的错误。

初始化模型的代码如下:

TensorFlowImageClassifier c = new TensorFlowImageClassifier();
c.inferenceInterface = new TensorFlowInferenceInterface();
if (c.inferenceInterface.initializeTensorFlow(assetManager, modelFilename) != 0) {
         throw new RuntimeException("TF initialization failed");
}

请为我提供解决方案或解决方法

2 个答案:

答案 0 :(得分:4)

通过将“libandroid_tensorflow_inference_java.jar”和“libtensorflow_inference.so”更新为最新版本(即Tensorflow - 1.4),解决了上述问题。可以找到最新的“.jar”和“。so”文件here

问题是由于Tensorflow版本不匹配造成的。在ImageNet上训练的Mobilenet分类器是基于Tensorflow - 1.3构建的,并且用于在Android上使用Tensorflow - 1.1进行推理。

答案 1 :(得分:0)

这里在主要活动java文件

中说
private static final String MODEL_FILE = "file:///android_asset/expert-graph.pb";
private static final String LABEL_FILE = "file:///android_asset/labels.txt";

您的模型文件似乎是&#34; mobilenet_imagenet.pb&#34;。在此确保您的模型和标签名称与项目文件匹配后,更改您训练的输入大小。(retrain.py文件可能包含此信息。)

private static final int INPUT_SIZE = 160;//
private static final int IMAGE_MEAN = 128;
private static final float IMAGE_STD = 128;
private static final String OUTPUT_NAME = "final_result";