概述

学术界对精度、自由度的要求和工业界对速度、精简度的要求形成了反差,这就使得越来越多的框架开始把training和inference分开,各公司都开始针对移动设备纷纷推出高性能inference库。

tflite

tflite其实就是谷歌自己的一个轻量级推理库。主要用于移动端。之前的tensorflow mobile那一套到2019年就不再维护了。

tflite使用的思路主要是从预训练的模型转换为tflite模型文件,拿到移动端部署。

tflite的源模型可以来自tensorflow的saved model或者frozen model,也可以来自keras。

tflite做了哪些优化

  • 用Flatbuffer序列化模型文件,这种格式磁盘占用少,加载快
  • 量化。这个特性是可以开关的,可以把float参数量化为uint8类型,模型文件更小、计算更快。
  • 剪枝、结构合并和蒸馏。我也不是很确定,敢写在这里主要来自两个官方文件,具体链接在本文最下方参考资料里。一个是《Model optimization》,这里提到了优化模型用到了模型优化方法,另一个是《Converter command-line examples》,里面一张对比优化前后的计算图显示tflite在转换时确实进行了结构调整。但是这个特性没有很多人讲,有可能这方面tflite做的不是很多,只是浅尝辄止。
  • 对NNAPI的支持。上三个特性都是转换模型文件的特性,这个是运行时的特性。也就是调用安卓底层的接口,把异构的计算能力利用起来。虽然 TFLite 基于 NNAPI,理论上是可以利用上各种运算芯片的,但目前还没有很多运算芯片支持 NNAPI。

量化

对量化的理解主要来自《用 TensorFlow 压缩神经网络》。

tflite的量化并不是全程使用uint8计算。而是存储每层的最大和最小值,然后把这个区间线性分成 256 个离散值,于是此范围内的每个浮点数可以用八位 (二进制) 整数来表示,近似为离得最近的那个离散值。比如,最小值是 -3 而最大值是 6 的情形,0 字节表示 -3,255 表示 6,而 128 是 1.5。

每个操作都先用整形计算,输出时重新转换为浮点型。下图就是量化Relu的示意图。

如果连续一串操作都有等价的浮点操作,则会有许多相邻的量化/去量化操作。当发现这种模式之后,转换程序会把相互抵消的那些操作移除,比如:

由于每层最大值最小值不一样,所以没法把整形从头算到尾,中间还是有不少量化/去量化操作。

tfite的缺陷

TFLite 目前仅提供有限的算子,主要以 CNN 中使用到的算子为主,如卷积、池化等。
有可能遇到的情况就是,模型的某些算子tflite不支持(比如反卷积),你可以自定义一个 TFLite 算子,将其注册在 TFLite 的 kernels 列表中,这样编译得到的 TFLite 库就可以处理该算子了。同时,在模型转换时,还需要加上 --allow_custom_ops 选项,将 TFLite 默认不支持的算子也保留在模型中。(本段来自《有道云笔记是如何使用 TensorFlow Lite 的》)

tflite支持的算子列表在《TensorFlow Lite & TensorFlow Compatibility Guide》这个页面上。

如何将tensorflow模型文件转换为tflite文件

本节来自《Tensorflow lite for 移动端安卓开发(二)——完整详细过程训练自己的模型》

生成float inference模型

cd /home/liuli/tensorflow
bazel build tensorflow/contrib/lite/toco:toco
bazel run --config=opt tensorflow/contrib/lite/toco:toco -- \--input_file=/home/liuli/work/Tensorflow/1_frozen.pb \--output_file=/home/liuli/work/Tensorflow/7_float.tflite \--inference_type=FLOAT \--input_shape=1,224,224,3 \--input_array=input \--output_array=MobilenetV1/Predictions/Reshape_1

生成Quant inference模型

cd /home/liuli/tensorflow
bazel build tensorflow/contrib/lite/toco:toco
bazel run --config=opt tensorflow/contrib/lite/toco:toco -- \--input_file=/home/liuli/work/Tensorflow/1_frozen.pb \--output_file=/home/liuli/work/Tensorflow/7.tflite \--input_format=TENSORFLOW_GRAPHDEF \--output_format=TFLITE \--inference_type=QUANTIZED_UINT8 \--input_shape=1,224,224,3 \--input_array=input \--output_array=MobilenetV1/Predictions/Reshape_1 \--default_ranges_min=0 \--default_ranges_max=6 \--std_value=127.5 \--mean_value=127.5

量化的效果

参考了《tflite现成的模型》,这个页面是tensorflow的github。

float类型的tflite模型(未量化):

量化的效果:

看来还是要量化,否则调用太慢。这里的结果看来量化的精度损失不大,但是网上有人测试效果差挺远,所以要具体分析。

查看输入输出节点

编译:

Bazel build tensorflow/tools/graph_transforms:summarize_graph  (查看模型结构,找出输入输出)

该命令查看整个Tensorflow模型概况,使用命令如下,运行之后,得到自己整个网络结构,从中可以找到自己模型的输入输出,如下图(模型比较乱。。。)

# “--in_graph=” 后面是模型存储的位置
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=../mz_graph.pb

本节主要来自:《Tensorflow 模型转 tflite ,在安卓端使用》

参考资料

官方文档

  • Introduction to TensorFlow Lite
  • Post-training quantization
  • Model optimization
  • tflite现成的模型
  • Converter command-line examples
  • TensorFlow Lite & TensorFlow Compatibility Guide

大神的博客中文翻译:用 TensorFlow 压缩神经网络(详细解释了为何量化有效)

Tensorflow 模型转 tflite ,在安卓端使用(介绍了ftlite的基本流程和概念)

知乎大神:从TensorFlow Lite源码入门CNN量化

有道云笔记是如何使用 TensorFlow Lite 的

GEMM-通用矩阵乘法:

  • 深度学习中GEMM的前世今生
  • Why GEMM is at the heart of deep learning

Tensorflow lite for 移动端安卓开发(二)——完整详细过程训练自己的模型

tensorflow 19: tflite 概念理解相关推荐

  1. 深度学习中IU、IoU(Intersection over Union)的概念理解以及python程序实现

    from: 深度学习中IU.IoU(Intersection over Union)的概念理解以及python程序实现 IoU(Intersection over Union) Intersectio ...

  2. 高性能计算中并行的概念理解

    高性能计算中并行的概念理解 分类: 并行计算高性能计算HPC - General2011-11-09 22:54 932人阅读 评论(0) 收藏 举报 编译器编程parallel优化formsvect ...

  3. 目标检测基本概念理解之IoU(交并比)以及Python代码实现

    目标检测基本概念理解之IoU(交并比) 交并比理解 Python代码实现 计算IoU,矩形框的坐标形式为xyxy 计算IoU,矩形框的坐标形式为xywh 交并比理解 在检测任务中,使用交并比(Inte ...

  4. Hadoop:HDFS的概念理解和体系架构-成都加米谷大数据分享

    HDFS是什么? HDFS 全称 Hadoop Distributed File System ,简称HDFS,是一个分布式文件系统.它是谷歌的GFS提出之后出现的另外一种文件系统.它有一定高度的容错 ...

  5. muck数据的概念理解

    muck数据的概念理解 所谓muck表示"模仿","假的":也可翻译为mock-test. 很多项目案例的讲解中,经常会提及muck数据.muck对象.muck ...

  6. 事件与委托的一点概念理解

    事件与委托的一点概念理解 早就接触过delegate和event,但是始终是一知半解,今天刚好有机会就好好研究一下! Delegate 顾名思义就是委托,委托的意思就是麻烦别人帮我干些事情.比如,我要 ...

  7. 目标检测中IoU(Intersection over Union)的概念理解

    参考博客 深度学习中IU.IoU(Intersection over Union)的概念理解以及python程序实现 一.IoU(交并比)概念 Intersection over Union,是一种测 ...

  8. C/C++中宏概念理解

    C/C++中宏概念理解 C/C++中宏概念理解 宏替换是C/C++系列语言的技术特色,C/C++语言提供了强大的宏替换功能,源代码在进入编译器之前,要先经过一个称为"预处理器"的模 ...

  9. DSF学习1_Dubbo详解(一)分布式服务框架的概念理解

    Dubbo分布式服务框架的概念理解 Dubbo是是一个高性能,基于Java的RPC框架,由阿里巴巴开源.一个分布式的服务框架.可以实现SOA(面向服务的架构)架构. Dubbo使用的公司:京东.当当. ...

最新文章

  1. 10-1-直接插入排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
  2. obj c和java_PKCS1-padding / RSA加密ios objc和java之间的区别
  3. Cannot load libmkl_avx.so or libmkl_def.so
  4. 机器学习(MACHINE LEARNING)MATLAB和Python混合编程
  5. python 字符转义_【课堂笔记】Python基础语法:字符串
  6. Java 基本数据类型
  7. 架设mediawiki服务器续--安装VisualEditor编辑器
  8. Oracle访问同义词连接超时,利用同义词解决oracle用户访问其它schema的对象
  9. Serverless 实战 —— Serverless + Egg.js 后台管理系统实战
  10. Waymo乘客交互系统亮相,还带西方记者试乘了没司机的真·无人车
  11. Express初级学习
  12. 2021 年系统分析师下午真题及答案
  13. Spire.Office for Java 7.5.4
  14. [Js] Js实现继承的5种方式
  15. 携程React Native实践
  16. Aspose.Cells Excel删除行
  17. 《数据结构与算法》(十九)- 多路查找树
  18. python生僻字如何转码_如何用Python检测生僻字
  19. 前端--实体,meta,语义化标签1
  20. 《杜拉拉升职记》职场36计

热门文章

  1. python中 “按位与,或,异或”与C语言的不同
  2. 模糊测试工具defensics
  3. 如何降低代码圈复杂度
  4. 训练误差与泛化误差的说明
  5. 记录1——stm32f411CEU6之点亮一盏LED灯+按键控制LED灯
  6. 如何激活word2010
  7. HTML语言教程(完整版)
  8. UDP Socket接收缓冲区与netstat Recv-Q
  9. RGB接口屏和SPI接口屏的引脚
  10. 前端学习——html、css