【tensorflow-v2.0】如何将模型转换成tflite模型
前言
TensorFlow Lite 提供了转换 TensorFlow 模型,并在移动端(mobile)、嵌入式(embeded)和物联网(IoT)设备上运行 TensorFlow 模型所需的所有工具。之前想部署tensorflow模型,需要转换成tflite模型。
实现过程
1.不同模型的调用函数接口稍微有些不同
# Converting a SavedModel to a TensorFlow Lite model.
converter = lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert() # Converting a tf.Keras model to a TensorFlow Lite model.
converter = lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert() # Converting ConcreteFunctions to a TensorFlow Lite model.
converter = lite.TFLiteConverter.from_concrete_functions([func])
tflite_model = converter.convert()
2. 完整的实现
import tensorflow as tf
saved_model_dir = './mobilenet/'
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.experimental_new_converter = True
tflite_model = converter.convert()
open('model_tflite.tflite', 'wb').write(tflite_model)
其中,
@classmethod
from_saved_model(
cls,
saved_model_dir,
signature_keys=None,
tags=None
)
另外
For more complex SavedModels, the optional parameters that can be passed into TFLiteConverter.from_saved_model() are input_arrays, input_shapes, output_arrays, tag_set and signature_key. Details of each parameter are available by running help(tf.lite.TFLiteConverter).
对于如何查看模型的操作op,可查看here;
help(tf.lite.TFLiteConverter)结果
Help on class TFLiteConverterV2 in module tensorflow.lite.python.lite: class TFLiteConverterV2(TFLiteConverterBase)
| TFLiteConverterV2(funcs, trackable_obj=None)
|
| Converts a TensorFlow model into TensorFlow Lite model.
|
| Attributes:
| allow_custom_ops: Boolean indicating whether to allow custom operations.
| When false any unknown operation is an error. When true, custom ops are
| created for any op that is unknown. The developer will need to provide
| these to the TensorFlow Lite runtime with a custom resolver.
| (default False)
| target_spec: Experimental flag, subject to change. Specification of target
| device.
| optimizations: Experimental flag, subject to change. A list of optimizations
| to apply when converting the model. E.g. `[Optimize.DEFAULT]
| representative_dataset: A representative dataset that can be used to
| generate input and output samples for the model. The converter can use the
| dataset to evaluate different optimizations.
| experimental_enable_mlir_converter: Experimental flag, subject to change.
| Enables the MLIR converter instead of the TOCO converter.
|
| Example usage:
|
| ```python
| # Converting a SavedModel to a TensorFlow Lite model.
| converter = lite.TFLiteConverter.from_saved_model(saved_model_dir)
| tflite_model = converter.convert()
|
| # Converting a tf.Keras model to a TensorFlow Lite model.
| converter = lite.TFLiteConverter.from_keras_model(model)
| tflite_model = converter.convert()
|
| # Converting ConcreteFunctions to a TensorFlow Lite model.
| converter = lite.TFLiteConverter.from_concrete_functions([func])
| tflite_model = converter.convert()
| ```
|
| Method resolution order:
| TFLiteConverterV2
| TFLiteConverterBase
| builtins.object
|
| Methods defined here:
|
| __init__(self, funcs, trackable_obj=None)
| Constructor for TFLiteConverter.
|
| Args:
| funcs: List of TensorFlow ConcreteFunctions. The list should not contain
| duplicate elements.
| trackable_obj: tf.AutoTrackable object associated with `funcs`. A
| reference to this object needs to be maintained so that Variables do not
| get garbage collected since functions have a weak reference to
| Variables. This is only required when the tf.AutoTrackable object is not
| maintained by the user (e.g. `from_saved_model`).
|
| convert(self)
| Converts a TensorFlow GraphDef based on instance variables.
|
| Returns:
| The converted data in serialized format.
|
| Raises:
| ValueError:
| Multiple concrete functions are specified.
| Input shape is not specified.
| Invalid quantization parameters.
|
| ----------------------------------------------------------------------
| Class methods defined here:
|
| from_concrete_functions(funcs) from builtins.type
| Creates a TFLiteConverter object from ConcreteFunctions.
|
| Args:
| funcs: List of TensorFlow ConcreteFunctions. The list should not contain
| duplicate elements.
|
| Returns:
| TFLiteConverter object.
|
| Raises:
| Invalid input type.
|
| from_keras_model(model) from builtins.type
| Creates a TFLiteConverter object from a Keras model.
|
| Args:
| model: tf.Keras.Model
|
| Returns:
| TFLiteConverter object.
|
| from_saved_model(saved_model_dir, signature_keys=None, tags=None) from builtins.type
| Creates a TFLiteConverter object from a SavedModel directory.
|
| Args:
| saved_model_dir: SavedModel directory to convert.
| signature_keys: List of keys identifying SignatureDef containing inputs
| and outputs. Elements should not be duplicated. By default the
| `signatures` attribute of the MetaGraphdef is used. (default
| saved_model.signatures)
| tags: Set of tags identifying the MetaGraphDef within the SavedModel to
| analyze. All tags in the tag set must be present. (default set(SERVING))
|
| Returns:
| TFLiteConverter object.
|
| Raises:
| Invalid signature keys.
|
| ----------------------------------------------------------------------
| Data descriptors inherited from TFLiteConverterBase:
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
问题:
使用tf_saved_model中生成mobilenet网络模型转换成tfLite能够成功,为什么使用另一个设计的模型进行转换却出现问题了呢??
Traceback (most recent call last):
File "pb2tflite.py", line , in <module>
tflite_model = converter.convert()
File "~/.local/lib/python3.7/site-packages/tensorflow_core/lite/python/lite.py", line , in convert
"invalid shape '{1}'.".format(_get_tensor_name(tensor), shape_list))
ValueError: None is only supported in the 1st dimension. Tensor 'images' has invalid shape '[None, None, None, None]'.
facebox模型节点:
(tf_test) ~/workspace/test_code/github_test/faceboxes-tensorflow$ saved_model_cli show --dir model/detector/ --all MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs: signature_def['__saved_model_init_op']:
The given SavedModel SignatureDef contains the following input(s):
The given SavedModel SignatureDef contains the following output(s):
outputs['__saved_model_init_op'] tensor_info:
dtype: DT_INVALID
shape: unknown_rank
name: NoOp
Method name is: signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['images'] tensor_info:
dtype: DT_FLOAT
shape: (-, -, -, -)
name: serving_default_images:
The given SavedModel SignatureDef contains the following output(s):
outputs['boxes'] tensor_info:
dtype: DT_FLOAT
shape: (-, , )
name: StatefulPartitionedCall:
outputs['num_boxes'] tensor_info:
dtype: DT_INT32
shape: (-)
name: StatefulPartitionedCall:
outputs['scores'] tensor_info:
dtype: DT_FLOAT
shape: (-, )
name: StatefulPartitionedCall:
Method name is: tensorflow/serving/predict
mobilenet的模型节点
~/workspace/test_code/github_test/faceboxes-tensorflow/mobilenet$ saved_model_cli show --dir ./ --all MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs: signature_def['__saved_model_init_op']:
The given SavedModel SignatureDef contains the following input(s):
The given SavedModel SignatureDef contains the following output(s):
outputs['__saved_model_init_op'] tensor_info:
dtype: DT_INVALID
shape: unknown_rank
name: NoOp
Method name is: signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['input_1'] tensor_info:
dtype: DT_FLOAT
shape: (-, , , )
name: serving_default_input_1:
The given SavedModel SignatureDef contains the following output(s):
outputs['act_softmax'] tensor_info:
dtype: DT_FLOAT
shape: (-, )
name: StatefulPartitionedCall:
Method name is: tensorflow/serving/predict
得到大神指点,tflite是静态图,需要指定hwc的值,在此谢过,那么问题来了,怎么指定hwc呢?
import tensorflow as tf
saved_model_dir = './model/detector/'
model = tf.saved_model.load(saved_model_dir)
concrete_func = model.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
concrete_func.inputs[0].set_shape([1, 512, 512, 3])
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
# converter.experimental_new_converter = True
tflite_model = converter.convert()
open('model_tflite_facebox.tflite', 'wb').write(tflite_model)
error
Some of the operators in the model are not supported by the standard TensorFlow Lite runtime. If those are native TensorFlow operators, you might be able to use the extended runtime by passing --enable_select_tf_ops, or by setting target_ops=TFLITE_BUILTINS,SELECT_TF_OPS when calling tf.lite.TFLiteConverter(). Otherwise, if you have a custom implementation for them you can disable this error with --allow_custom_ops, or by setting allow_custom_ops=True when calling tf.lite.TFLiteConverter(). Here is a list of builtin operators you are using: ADD, AVERAGE_POOL_2D, CONCATENATION, CONV_2D, MAXIMUM, MINIMUM, MUL, NEG, PACK, RELU, RESHAPE, SOFTMAX, STRIDED_SLICE, SUB, UNPACK. Here is a list of operators for which you will need custom implementations: TensorListFromTensor, TensorListReserve, TensorListStack, While.
TensorFlow Lite 已经内置了很多运算符,并且还在不断扩展,但是仍然还有一部分 TensorFlow 运算符没有被 TensorFlow Lite 原生支持。这些不被支持的运算符会给 TensorFlow Lite 的模型转换带来一些阻力。
import tensorflow as tf
saved_model_dir = './model/detector/'
model = tf.saved_model.load(saved_model_dir)
concrete_func = model.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
concrete_func.inputs[0].set_shape([1, 512, 512, 3])
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS]
# converter.experimental_new_converter = True
tflite_model = converter.convert()
open('model_tflite_facebox.tflite', 'wb').write(tflite_model)
还是有点问题。。。
参考
2. stackoverflow_how-to-create-a-tflite-file-from-saved-model-ssd-mobilenet;
3. tfv1-模型文件转换;
5. tf_saved_model;
8. ops_select;
完
【tensorflow-v2.0】如何将模型转换成tflite模型的更多相关文章
- 「新手必看」Python+Opencv实现摄像头调用RGB图像并转换成HSV模型
在ROS机器人的应用开发中,调用摄像头进行机器视觉处理是比较常见的方法,现在把利用opencv和python语言实现摄像头调用并转换成HSV模型的方法分享出来,希望能对学习ROS机器人的新手们一点帮助 ...
- 三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署
本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 前文:三分钟快速上手TensorFlow 2.0 (上)——前置基础.模型建立与可视化 tf.train. ...
- TensorFlow v2.0实现逻辑斯谛回归
使用TensorFlow v2.0实现逻辑斯谛回归 此示例使用简单方法来更好地理解训练过程背后的所有机制 MNIST数据集概览 此示例使用MNIST手写数字.该数据集包含60,000个用于训练的样本和 ...
- 利用反射将Datatable、SqlDataReader转换成List模型
1. DataTable转IList public class DataTableToList<T>whereT :new() { ///<summary> ///利用反射将D ...
- h5模型文件转换成pb模型文件
本文主要记录Keras训练得到的.h5模型文件转换成TensorFlow的.pb文件 #*-coding:utf-8-* """ 将keras的.h5的模型文件,转换 ...
- 三分钟快速上手TensorFlow 2.0 (上)——前置基础、模型建立与可视化
本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 学习笔记类似提纲,具体细节参照上文链接 一些前置的基础 随机数 tf.random uniform(sha ...
- 使用TensorFlow v2.0构建多层感知器
使用TensorFlow v2.0构建一个两层隐藏层完全连接的神经网络(多层感知器). 这个例子使用低级方法来更好地理解构建神经网络和训练过程背后的所有机制. 神经网络概述 MNIST 数据集概述 此 ...
- 使用TensorFlow v2.0构建卷积神经网络
使用TensorFlow v2.0构建卷积神经网络. 这个例子使用低级方法来更好地理解构建卷积神经网络和训练过程背后的所有机制. CNN 概述 MNIST 数据集概述 此示例使用手写数字的MNIST数 ...
- TensorFlow v2.0实现Word2Vec算法
使用TensorFlow v2.0实现Word2Vec算法计算单词的向量表示,这个例子是使用一小部分维基百科文章来训练的. 更多信息请查看论文: Mikolov, Tomas et al. " ...
随机推荐
- 20180429模拟赛T1——添边问题
[问题描述] 没有环的有向图称为有向无环图,这是一个多么美好的结构吖. 如果有一张有 N 个点的有向图,我们可能需要删掉一些边使它变成一张有向无环图.假设初始时我们只有 N 个互不相连的点,当然它也是 ...
- hdu3974-Assign the task-(dfs+线段树)
题意:有n个人,有上下级关系,有m个操作,有两种操作1.把一个任务分给某个人,他的下属也会停下手中工作和他一起做:2.查询某个人的当前任务是什么? 解题:n-1个关系,总有一个人没有上级,以他为根节点 ...
- new String("123") 创建了几个对象?
String 对象可谓再熟悉不过了,与此相关的面试题经常会引出内存性能优化的问题,本篇主要以 new String("123") 创建了几个对象为例记录. 一.你能回答正确吗 St ...
- make命令与Makefile(转载)
概述博客内容包含linux下make命令的使用与makefile的书写规则等,希望通过本文档使读者对make命令makefile文件有进一步了解,由于鄙人经验学识有限文档中会有描述不准确以及理解偏差, ...
- benchmarkdotnet docker 运行
使用docker 运行基准测试是一个不错的选择,可以减少我们环境搭建的时间,同时也可以加速ci/cd 环境准备 docker-compose 文件 version: "3" ser ...
- Linux下g++编译thread出错的的解决方法
错误如下图所示: 因为thread是C++11新加入的特性,所以我们在用g++编译的时候不能直接用,需要在g++后面加上 -std=c++0x -pthread 如果是gcc编译多线程的话则应该要用 ...
- paython基础-格式化输出
目录 %s %r %d 及其他%... formate f"{变量}" 详细查找:https://docs.python.org/3/library/string.html#for ...
- selenuim自动化爬取汽车在线谷米爱车网车辆GPS数据爬虫
#为了实时获取车辆信息,以及为了后面进行行使轨迹绘图,写了一个基于selelnium的爬虫爬取了车辆gps数据. #在这里发现selenium可以很好的实现网页解析和处理js处理 #导包 import ...
- [CMS]凡诺cms 2.1文件包含
0x01 简介 凡诺CMS下载链接:凡诺企业网站管理系统PHP 2.1 安装好了是这样的: 0x02 漏洞复现 在添加频道处上传附件: 根据网站根目录所在位置用../进行跨目录: 然后返回首页点击频道 ...
- MVC WebApi Swagger帮助文档 接口用法
1.WebApi在解决方案Apps.WebApi中 2.将Apps.WebApi设置为启动项目之后,可以直接浏览到Api的帮助文档,并直接进行调试 3.登录接口 4.登录获取的token来访问其他接口 ...