我已通过以下方式将模型导出到ONNX:
# Export the model
torch_out = torch.onnx._export(learn.model, # model being run
x, # model input (or a tuple for multiple inputs)
EXPORT_PATH + "mnist.onnx", # where to save the model (can be a file or file-like object)
export_params=True) # store the trained parameter weights inside the model file
现在,我正在尝试将模型转换为Tensorflow Lite文件,以便在Android上进行推理。不幸的是,PyTorch/Caffe 2支持相当缺乏,或者对Android来说过于复杂,但Tensorflow看起来要简单得多。
ONNX到Tflite的文档在这方面很轻。
我尝试过通过以下方式导出到Tensorflow GraphDef原型:tf_rep.export_graph(EXPORT_PATH + 'mnist-test/mnist-tf-export.pb')
然后运行toco
:
toco \
--graph_def_file=mnist-tf-export.pb \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--inference_type=FLOAT \
--input_type=FLOAT \
--input_arrays=0 \
--output_arrays=add_10 \
--input_shapes=1,3,28,28 \
--output_file=mnist.tflite`
当我这样做时,我得到了以下错误:
File "anaconda3/lib/python3.6/site-packages/tensorflow/lite/python/convert.py", line 172, in toco_convert_protos
"TOCO failed. See console for info.\n%s\n%s\n" % (stdout, stderr))
tensorflow.lite.python.convert.ConverterError: TOCO failed. See console for info.
2018-11-06 16:28:33.864889: I tensorflow/lite/toco/import_tensorflow.cc:1268] Converting unsupported operation: PyFunc
2018-11-06 16:28:33.874130: F tensorflow/lite/toco/import_tensorflow.cc:114] Check failed: attr.value_case() == AttrValue::kType (1 vs. 6)
此外,即使运行该命令,我也不知道该为input_arrays或output_arrays指定什么,因为该模型最初是在PyTorch中构建的。
有没有人成功地将他们的ONNX模型转换为TFlite?
下面是我尝试转换的ONNX文件:https://drive.google.com/file/d/1sM4RpeBVqPNw1WeCROpKLdzbSJPWSK79/view?usp=sharing
额外信息
- Python 3.6.6的基本功能:Anaconda自定义(64位)
- onnx.版本= '1.3.0'
- tf.版本= '1.13.0-设备编号20181106'
- 手电筒。版本= '1.0.0.dev20181029'
3条答案
按热度按时间yk9xbfzb1#
我认为您提供的ONNX文件(即
model.onnx
)已损坏,我不知道问题是什么,但它没有对ONNX运行时进行任何推断。现在您可以直接在移动的上运行PyTorch模型。查看PyTorch Mobile的文档here
**此答案适用于TensorFlow版本1,
对于TensorFlow版本2或更高版本,请单击链接**
将模型从protobuf freezeGraph转换为TFlite的最佳方法是使用官方TensorFlow lite转换器文档
根据TensorFlow Docs,TocoConverter已被弃用
此类(tf.compat.v1.lite.TocoConverter)已被弃用。请改用lite.TFLiteConverter。
从PyTorch转换为ONNX型号
将模型从Pytorch转换为Onnx的最佳做法是,您应添加以下参数,以在**torch.onnx.export()**函数中指定模型的输入和输出图层的名称
因此,在您的情况下:现在使用onnx-tf将此模型导出到TensorFlow protobuf FreezeGraph
请注意,此方法仅在tensorflow_version〈2时有效
从ONNX转换为TensorFlow冻结图
要转换模型,请通过以下命令安装onnx-tf版本1.5.0
现在,要将.onnx模型转换为TensorFlow冻结图,请在shell中运行以下命令
从TensorFlow冻结图.pb转换为TF
现在,使用以下代码将此模型从.pb文件转换为tflite模型
要选择最适合您的模型用例优化的选项,请参阅有关TensorFlow lite优化的官方指南
https://www.tensorflow.org/lite/guide/get_started#4_optimize_your_model_optional
注意:您可以尝试我的Jupyter笔记本将ONNX模型转换为Tensorflow Lite在谷歌协作链接
r9f1avp52#
现在您可以直接在移动的上运行PyTorch模型。查看PyTorch Mobile的文档here
**此答案适用于TensorFlow版本2或更高版本,
如需了解TensorFlow版本1,请单击此处**
将模型从protobuf freezeGraph转换为TFlite的最佳方法是使用官方TensorFlow lite转换器文档
根据TensorFlow Docs,TocoConverter已被弃用
此类(tf.compat.v1.lite.TocoConverter)已被弃用。请改用lite.TFLiteConverter。
从PyTorch转换为ONNX型号
因此,在您的情况下:现在使用onnx-tf将此模型导出到TensorFlow protobuf FreezeGraph
从ONNX转换为TensorFlow冻结图
要转换模型,请使用以下命令安装onnx-tf
现在,要将.onnx模型转换为TensorFlow冻结图,请在shell中运行以下命令
从TensorFlow冻结图.pb转换为TF
现在,使用以下代码将此模型从.pb文件转换为tflite模型
要选择最适合您的模型用例优化的选项,请参阅有关TensorFlow lite优化的官方指南
https://www.tensorflow.org/lite/guide/get_started#4_optimize_your_model_optional
fykwrbwg3#
在Google协作中:
第一个