我基本上使用freeze_graph冻结模型,然后尝试使用TocoConverter将模型转换为tflite,但它给出了错误:
RuntimeError: TOCO failed see console for info.
b'/bin/sh: 1: toco_from_protos: not found\n'
None 下面是我的代码:
graph_def_file = './frozen_model2.pb'
input_arrays = ['IteratorGetNext']
output_arrays = ['model/fc_result/prediction/BiasAdd']
converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)任何帮助都将不胜感激!
发布于 2018-10-31 11:26:38
错误b'/bin/sh: 1: toco_from_protos: not found\n'表示找不到外壳命令toco_from_protos。我猜toco --help也不适合你。
我从源代码构建了TensorFlow1.9.0,所以我想我一定是搞错了设置toco和toco_from_protos等外壳命令的步骤。
总之,我的回溯是这样的:
File "/home/casey/anaconda3/envs/mnist/lib/python3.6/site-packages/tensorflow/contrib/lite/python/lite.py", line 330, in convert
dump_graphviz_video=self.dump_graphviz_video)
File "/home/casey/anaconda3/envs/mnist/lib/python3.6/site-packages/tensorflow/contrib/lite/python/convert.py", line 263, in toco_convert
input_data.SerializeToString())
File "/home/casey/anaconda3/envs/mnist/lib/python3.6/site-packages/tensorflow/contrib/lite/python/convert.py", line 107, in toco_convert_protos
(stdout, stderr))
RuntimeError: TOCO failed see console for info.
b'/bin/sh: 1: toco_from_protos: not found\n'
None如果您跟踪回溯到[python path]/site-packages/tensorflow/contrib/lite/python/convert.py中的第107行,您将看到toco_convert_protos()的定义中包含一些逻辑,以将toco_from_protos作为外壳命令运行:
# TODO(aselle): When toco does not use fatal errors for failure, we can
# switch this on.
if not _toco_from_proto_bin:
return _toco_python.TocoConvert(
model_flags_str, toco_flags_str, input_data_str)
with _tempfile.NamedTemporaryFile() as fp_toco, \
_tempfile.NamedTemporaryFile() as fp_model, \
_tempfile.NamedTemporaryFile() as fp_input, \
_tempfile.NamedTemporaryFile() as fp_output:
fp_model.write(model_flags_str)
fp_toco.write(toco_flags_str)
fp_input.write(input_data_str)
fp_model.flush()
fp_toco.flush()
fp_input.flush()
cmd = [
_toco_from_proto_bin, fp_model.name, fp_toco.name, fp_input.name,
fp_output.name
]
cmdline = " ".join(cmd)
proc = _subprocess.Popen(
cmdline,
shell=True,
stdout=_subprocess.PIPE,
stderr=_subprocess.STDOUT,
close_fds=True)
stdout, stderr = proc.communicate()
exitcode = proc.returncode
if exitcode == 0:
stuff = fp_output.read()
return stuff
else:
raise RuntimeError("TOCO failed see console for info.\n%s\n%s\n" %
(stdout, stderr))如果您的toco和toco_from_protos外壳命令不起作用,那么很明显,这一步将失败。
作为[python path]/site-packages/tensorflow/contrib/lite/python/convert.py中的一种解决方法,我进行了此更改,以强制返回第一个案例:
if _toco_from_proto_bin:
# if not _toco_from_proto_bin: # comment out this line to force return
return _toco_python.TocoConvert(
model_flags_str, toco_flags_str, input_data_str)简奇,但它帮我完成了任务。正确的解决方案可能是重新安装具有工作toco的Tensorflow版本,或者如果您是从源代码构建,则重做bazel构建。
发布于 2019-03-12 23:33:14
确保toco脚本位于您的搜索路径中。检查PATH变量。
看起来它们是安装在/home/user/.local/bin中的,所以将这个添加到PATH变量中。
发布于 2019-05-24 05:55:12
https://stackoverflow.com/questions/52599110
复制相似问题