如何在制作tensorflow lite模型时设置input_array和outout_array名称

时间:2018-04-03 03:37:23

标签: tensorflow tensorflow-lite

OS平台和发行版:Linux Ubuntu 14.04

TensorFlow版本:来自二进制的张量流(1.4.0),

CUDA / cuDNN版本:cuda 8.0

我已经培训了一些带有tensorflow的定制模型,并试图使其成为移动应用程序的tensorflow lite模型。

我的模特定义如下:

def P_Net(inputs,label=None,bbox_target=None,landmark_target=None,training=True):
    #define common param
    with slim.arg_scope([slim.conv2d],
                        activation_fn=prelu,
                        weights_initializer=slim.xavier_initializer(),
                        biases_initializer=tf.zeros_initializer(),
                        weights_regularizer=slim.l2_regularizer(0.0005), 
                        padding='valid'):
        print inputs.get_shape()
        net = slim.conv2d(inputs, 28, 3, stride=1,scope='conv1')
......
        conv4_1 = slim.conv2d(net,num_outputs=2,kernel_size=[1,1],stride=1,scope='conv4_1',activation_fn=tf.nn.softmax)
        #conv4_1 = slim.conv2d(net,num_outputs=1,kernel_size=[1,1],stride=1,scope='conv4_1',activation_fn=tf.nn.sigmoid)

        print conv4_1.get_shape()
        #batch*H*W*4
        bbox_pred = slim.conv2d(net,num_outputs=4,kernel_size=[1,1],stride=1,scope='conv4_2',activation_fn=None)
        print bbox_pred.get_shape()

其中conv4_1和conv4_2是输出图层。

我冻结了模型:

freeze_graph.freeze_graph('out_put_model/model.pb', '', False, model_path, 'Squeeze,Squeeze_1', '', '', 'out_put_model/frozen_model.pb', '', '')
之后,我可以使用tensorboard来查看图表。并将其读回以进行双重检查,它将事物身份输出到检查点的模型。

然后我尝试将frozen_model.pb保存到tensorflow lite模型。找到tensorflow 1.4.0没有tensorflow lite模块,我从github检查tensorflow和bazel运行toco像:

bazel run --config=opt   //tensorflow/contrib/lite/toco:toco --   --input_file='/home/sens/mtcnn_cat/MTCNN-Tensorflow/test/out_put_model/frozen_model.pb'    --output_file='/home/sens/mtcnn_cat/MTCNN-Tensorflow/test/out_put_model/pnet.tflite'    --inference_type=FLOAT   --input_shape=1,128,128,3   --input_array=image_height,image_width,input_image   --output_array=Squeeze,Squeeze_1  --input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE --dump_graphviz=/tmp

然而,输出抱怨未找到输出数组:

INFO: Running command line: bazel-bin/tensorflow/contrib/lite/toco/toco '--input_file=/home/sens/mtcnn_cat/MTCNN-Tensorflow/test/out_put_model/frozen_model.pb' '--output_file=/home/sens/mtcnn_cat/MTCNN-Tensorflow/test/out_put_model/pnet.tflite' '--inference_type=FLOAT' '--input_shape=1,128,128,3' '--input_array=image_height,image_width,input_image' '--output_array=Squeeze,Squeeze_1' '--input_format=TENSORFLOW_GRAPHDEF' '--output_format=TFLITE' '--dump_graphviz=/tmp'
2018-04-03 11:17:37.412589: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1172] Converting unsupported operation: Abs
2018-04-03 11:17:37.412660: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1172] Converting unsupported operation: Abs
2018-04-03 11:17:37.412699: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1172] Converting unsupported operation: Abs
2018-04-03 11:17:37.412880: F tensorflow/contrib/lite/toco/tooling_util.cc:686] Check failed: model.HasArray(output_array) Output array not found: Squeeze,Squeeze_1

问题: 1.如何设置--output_array=Squeeze,Squeeze_1参数?我认为它与在张量板中的freeze_graph()中输出节点相同,我确实找到了" Squeeze"和" Squeeze_1"节点enter image description here

  1. 如何设置--input_shape=1,128,128,3 --input_array=image_height,image_width,input_image参数?我检查并发现手机有一个固定大小的图像输入,但在我的模型中,没有固定大小的输入图像和完全卷积输入,如:

        self.image_op = tf.placeholder(tf.float32, name='input_image')
        self.width_op = tf.placeholder(tf.int32, name='image_width')
        self.height_op = tf.placeholder(tf.int32, name='image_height')
        image_reshape = tf.reshape(self.image_op, [1, self.height_op, self.width_op, 3])
    
  2. 并重塑为1 *宽*高* 3 enter image description here

    那么如何将其写为输入形状?

4 个答案:

答案 0 :(得分:2)

对于输入数组

[node.op.name for node in model.inputs]

对于输出数组

[node.op.name for node in model.outputs]

答案 1 :(得分:1)

由于tensorflow,将冻结的模型转换为tf_lite从来都不是一件容易的事。希望这段代码可以帮助您总结图形并帮助您找到输出和输入数组

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph={PATH_TO_FROZEN_GRAPH}/optimized_best.pb`

答案 2 :(得分:1)

您可以使用下面的工具来确定输入和输出数组以及模型大小以及其他用于tflite转换的参数。这也可以创建张量流冻结图的可视化效果。 Github link for the tool

答案 3 :(得分:0)

当我尝试重新训练然后转换为tflite时遇到了这个问题。

这是对我有用的解决方案:

对于1.9及更高版本(可能还有1.8,尚未测试。),您需要删除--input_format field并将--input_file参数更改为--graph_def_file

所以您最终得到的命令看起来像:

toco \
  --graph_def_file=tf_files/retrained_graph.pb \
  --output_file=tf_files/optimized_graph.lite \
  --output_format=TFLITE \
  --input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3 \
  --input_array=input \
  --output_array=final_result \
  --inference_type=FLOAT \
  --inference_input_type=FLOAT

然后,我能够完成诗人的示例,并使我的tflite文件在android上运行。

来源: https://github.com/googlecodelabs/tensorflow-for-poets-2/issues/68