Java 为 runForMultipleInputsOutputs 分配内存时出现 TFLITE 错误
Java TFLITE error when allocating memory for runForMultipleInputsOutputs
我在为 Android Java 的 TFLITE 解释器准备输出时遇到错误。该模型有 1 个输入和 4 个输出。
interpreter.runForMultipleInputsOutputs(input, map_of_indices_to_outputs);
E/Run multiple: Internal error: Unexpected failure when preparing tensor allocations: tensorflow/lite/kernels/tile.cc:53 num_dimensions != num_multipliers (1 != 2)Node number 4 (TILE) failed to prepare.
输出要求是4个float数组的列表:
[ [1x1],[1x2], [1x2], [1x2] ]
python 中预测的输出是:
In [56] output = model.predict(new_observation_scaled)
Out[56]:
[array([[0.]], dtype=float32),
array([[137.66626, 335.7148 ]], dtype=float32),
array([[0.16666616, 0.40643442]], dtype=float32),
array([[9.9915421e-01, 8.4577635e-04]], dtype=float32)]
所以我在JAVA中准备了一个对象列表:
float [][] output0 = new float [1][1];
float [][] output1 = new float [1][2];
float [][] output2 = new float [1][2];
float [][] output3 = new float [1][2];
Object[] outputs = {output0,output1,output2,output3};
Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
map_of_indices_to_outputs.put(0, output0);
map_of_indices_to_outputs.put(1, output1);
map_of_indices_to_outputs.put(2, output2);
map_of_indices_to_outputs.put(3, output3);
你能帮我找出错误吗?
编辑:
这是从使用 tf 2.0-rc1 生成的 tflite 文件中读取的解释器详细信息:
f='.\models\pdb_20190923-163632.tflite'
interpreter = tf.lite.Interpreter(model_path=f)
interpreter
Out[16]: <tensorflow.lite.python.interpreter.Interpreter at 0x20684c69608>
interpreter.get_input_details()
Out[17]:
[{'name': 'RSSI',
'index': 4,
'shape': array([ 1, 15]),
'dtype': numpy.float32,
'quantization': (0.0, 0)}]
interpreter.get_output_details()
Out[18]:
[{'name': 'Identity',
'index': 0,
'shape': array([1, 1]),
'dtype': numpy.float32,
'quantization': (0.0, 0)},
{'name': 'Identity_1',
'index': 1,
'shape': array([1, 2]),
'dtype': numpy.float32,
'quantization': (0.0, 0)},
{'name': 'Identity_2',
'index': 2,
'shape': array([1, 2]),
'dtype': numpy.float32,
'quantization': (0.0, 0)},
{'name': 'Identity_3',
'index': 3,
'shape': array([1, 2]),
'dtype': numpy.float32,
'quantization': (0.0, 0)}]
我得到了问题的解决方案:
以同样的方式输出需要一个列表,输入也是如此:
Object[] outputs = {output0,output1,output2,output3};
Object[] inputs = {input};
interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
我在为 Android Java 的 TFLITE 解释器准备输出时遇到错误。该模型有 1 个输入和 4 个输出。
interpreter.runForMultipleInputsOutputs(input, map_of_indices_to_outputs);
E/Run multiple: Internal error: Unexpected failure when preparing tensor allocations: tensorflow/lite/kernels/tile.cc:53 num_dimensions != num_multipliers (1 != 2)Node number 4 (TILE) failed to prepare.
输出要求是4个float数组的列表:
[ [1x1],[1x2], [1x2], [1x2] ]
python 中预测的输出是:
In [56] output = model.predict(new_observation_scaled)
Out[56]:
[array([[0.]], dtype=float32),
array([[137.66626, 335.7148 ]], dtype=float32),
array([[0.16666616, 0.40643442]], dtype=float32),
array([[9.9915421e-01, 8.4577635e-04]], dtype=float32)]
所以我在JAVA中准备了一个对象列表:
float [][] output0 = new float [1][1];
float [][] output1 = new float [1][2];
float [][] output2 = new float [1][2];
float [][] output3 = new float [1][2];
Object[] outputs = {output0,output1,output2,output3};
Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
map_of_indices_to_outputs.put(0, output0);
map_of_indices_to_outputs.put(1, output1);
map_of_indices_to_outputs.put(2, output2);
map_of_indices_to_outputs.put(3, output3);
你能帮我找出错误吗?
编辑: 这是从使用 tf 2.0-rc1 生成的 tflite 文件中读取的解释器详细信息:
f='.\models\pdb_20190923-163632.tflite'
interpreter = tf.lite.Interpreter(model_path=f)
interpreter
Out[16]: <tensorflow.lite.python.interpreter.Interpreter at 0x20684c69608>
interpreter.get_input_details()
Out[17]:
[{'name': 'RSSI',
'index': 4,
'shape': array([ 1, 15]),
'dtype': numpy.float32,
'quantization': (0.0, 0)}]
interpreter.get_output_details()
Out[18]:
[{'name': 'Identity',
'index': 0,
'shape': array([1, 1]),
'dtype': numpy.float32,
'quantization': (0.0, 0)},
{'name': 'Identity_1',
'index': 1,
'shape': array([1, 2]),
'dtype': numpy.float32,
'quantization': (0.0, 0)},
{'name': 'Identity_2',
'index': 2,
'shape': array([1, 2]),
'dtype': numpy.float32,
'quantization': (0.0, 0)},
{'name': 'Identity_3',
'index': 3,
'shape': array([1, 2]),
'dtype': numpy.float32,
'quantization': (0.0, 0)}]
我得到了问题的解决方案:
以同样的方式输出需要一个列表,输入也是如此:
Object[] outputs = {output0,output1,output2,output3};
Object[] inputs = {input};
interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);