概述

学术界对精度、自由度的要求和工业界对速度、精简度的要求形成了反差,这就使得越来越多的框架开始把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. Linux下tcpdump用法
  2. windows下对路由表的操作命令
  3. 浪度九州城首页到内容页
  4. 网络传输中的两个阶段、阻塞IO、非阻塞IO和多路复用
  5. geoserver动态颜色参数样式、动态sql配置实现
  6. lvs + keepalived + nginx 实现高可用
  7. Nginx安装,目录结构与配置文件详解
  8. 判断一个数是偶数还是素数 做相应处理并排序输出
  9. C - 一个人的旅行(最短路径)
  10. 连续投影算法_腾讯优图 | 3D结构光摄像头深度算法综述
  11. 最短路径spfa算法
  12. 时间格式2020-01-13T16:00:00.000Z中的T和Z分别表示什么,如何处理
  13. 梦幻手游最新服务器,《梦幻西游》手游服务器如何选择 新区还是老区
  14. 【年终总结】你好2021,再见2020。
  15. 我的天空计算机音乐,我的天空(Acoustic Version)
  16. 小米前端面经(社招)
  17. 下载到烦人的流氓软件了,电脑卡,弹窗多的看不到鼠标怎么办
  18. 插入u盘有图标但计算机没盘,没插U盘却有U盘图标显示的原因和解决方法
  19. 阿里巴巴Java开发手册github地址
  20. 编辑/调试汇编语言所需要工具

热门文章

  1. AngularJS之有序列表
  2. Dijkstra算法和A*算法总结
  3. 定义字符串的两种方式
  4. AOP防止表单重复提交
  5. redis集群伸缩【转】
  6. JGit操作之2.0版
  7. 332B. Maximum Absurdity
  8. matlab生成随机矩阵
  9. 单调队列优化的DP问题
  10. Chrome插件开发(一)