Tensorflow 如何让toco使用shape=[None,24,24,3]

Tensorflow 如何让toco使用shape=[None,24,24,3],tensorflow,tensorflow-lite,Tensorflow,Tensorflow Lite,我正试图用图表来对小图像进行分类。 一切似乎都很顺利。但一旦我尝试将其转换为tflite,它就无法工作 问题似乎出在托科 如果我使用input\u nodes=x(x是tf.placeholder(tf.float32,shape=[None,IMAGE\u SIZE,IMAGE\u SIZE,3],name=“ipnode”)),它会给出以下错误: Traceback (most recent call last): File "create_model.py", line 217, in

我正试图用图表来对小图像进行分类。 一切似乎都很顺利。但一旦我尝试将其转换为tflite,它就无法工作

问题似乎出在托科

如果我使用
input\u nodes=x
(x是
tf.placeholder(tf.float32,shape=[None,IMAGE\u SIZE,IMAGE\u SIZE,3],name=“ipnode”)
),它会给出以下错误:

Traceback (most recent call last):
  File "create_model.py", line 217, in <module>
    tflite_model = tf.contrib.lite.toco_convert(input_graph_def, [input_nodes], [output_nodes])
  File "/.../tensorflow/lib/python2.7/site-packages/tensorflow/contrib/lite/python/convert.py", line 243, in toco_convert
    *args, **kwargs)
  File "/.../tensorflow/lib/python2.7/site-packages/tensorflow/contrib/lite/python/convert.py", line 212, in build_toco_convert_protos
    input_array.shape.dims.extend(map(int, input_tensor.get_shape()))
TypeError: __int__ returned non-int (type NoneType)
它可以运行,但在安卓系统中,它会崩溃:

Caused by: java.lang.NullPointerException: Internal error: Cannot allocate memory for the interpreter: tensorflow/contrib/lite/kernels/conv.cc:191 input->dims->size != 4 (0 != 4)Node 0 failed to prepare.

        at org.tensorflow.lite.NativeInterpreterWrapper.createInterpreter(Native Method)
        at org.tensorflow.lite.NativeInterpreterWrapper.<init>(NativeInterpreterWrapper.java:75)
        at org.tensorflow.lite.NativeInterpreterWrapper.<init>(NativeInterpreterWrapper.java:54)
        at org.tensorflow.lite.Interpreter.<init>(Interpreter.java:114)

更新1(使用来自\u冻结\u图形/来自\u会话问题的TocoConverter) 使用以下命令:

converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
    output_frozen_graph_name, [input_node_names], [output_node_names])
tflite_model = converter.convert()
open(output_converted_graph_name, "wb").write(tflite_model)
converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
  output_optimized_graph_name, [input_node_names], [output_node_names])
tflite_model = converter.convert()
open(output_converted_graph_name, "wb").write(tflite_model)
我得到一个错误:

Traceback (most recent call last):
  File "create_model.py", line 214, in <module>
    output_frozen_graph_name, [input_node_names], [output_node_names])
  File "/Users/.../tensorflow/lib/python2.7/site-packages/tensorflow/contrib/lite/python/lite.py", line 229, in from_frozen_graph
    raise ValueError("Please freeze the graph using freeze_graph.py.")
ValueError: Please freeze the graph using freeze_graph.py.
操作完成,我有一个tflite文件。我也可以在Android中正确使用该文件

但它确实返回了完全不同(错误)的结果。对冻结或优化的图形(pb文件)进行测试时,结果是正确的

此处的所有当前脚本:


解决方案 不知道为什么,但当我切换到使用命令行工具,只使用冻结图(而不是优化图)时,它工作正常

#################
## convert graph
#################

from subprocess import call
call([
    "toco",
    "--graph_def_file=" + output_frozen_graph_name,
    "--input_format=TENSORFLOW_GRAPHDEF",
    "--output_format=TFLITE",
    "--output_file=" + output_converted_graph_name,
    "--input_shape=1," + str(IMAGE_SIZE) + "," + str(IMAGE_SIZE) + ",3",
    "--input_type=FLOAT",
    "--input_array=" + input_node_names,
    "--output_array=" + output_node_names,
    "--inference_type=FLOAT",
    "--inference_input_type=FLOAT"
])
如果我使用冻结和优化的图形,它会显示:
ValueError:无法解析输入文件“model\u files/model\u optimized\u button.pb”。


此处的所有工作脚本:

TOCO不接受输入张量形式的值
None

建议使用以下方法,而不是使用
toco\u convert
。对于批量大小为
None
的任何型号,它会自动将批量大小指定为1。提供的最后几行代码应如下所示:

converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
    output_frozen_graph_name, [input_node_names], [output_node_names])
tflite_model = converter.convert()
open(output_converted_graph_name, "wb").write(tflite_model)
converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
  output_optimized_graph_name, [input_node_names], [output_node_names])
tflite_model = converter.convert()
open(output_converted_graph_name, "wb").write(tflite_model)

谢谢,这解决了这个问题:)。但我不知何故不得不在from_session()中使用它。在上面,它总是告诉我图表没有冻结。尽管我使用了正确的文件,但现在生成的tflite(使用from_会话)似乎有点损坏。请参阅上面更新1中的信息(以及我为什么使用from_session的详细信息)。不幸的是,我没有立即的建议。我的第一个建议是尝试将
output\u freezed\u graph\u name
传递到
from\u freezed\u graph
中,以查看这是否可以正常工作-以防
优化\u for\u推断
发生意外情况。接下来,保存传递到
tf.Session(graph=graph)
图形并确保其计算结果为所需值,以确保其正确无误。如果这两个建议都没有导致代码中出现明显的问题,那么我建议在TensorFlow repo中创建一个GitHub问题,其中包含所有信息,包括重现错误所需的文件和命令。在我使用命令行时,它以某种方式正常工作。更新答案以反映这一点。仍将接受您的答案,因为它帮助我找到了解决方案:)
converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
  output_optimized_graph_name, [input_node_names], [output_node_names])
tflite_model = converter.convert()
open(output_converted_graph_name, "wb").write(tflite_model)