目录

  • 简介
  • 为何不直接使用TensorFlow模型
  • Challenges(挑战)
  • 模型转换
  • 模型导出为MCU能识别的文件
  • TF Lite怎么在MCU上运行

简介

TensorFlow Lite是Tensorflow库中针对像笔记本、手机、树莓派、FPGA等边缘设备而设计的机器学习库,而TensorFlow Lite Micro则更加轻量级,专门针对microcontroller(MCU,即单片机)。我们生活中常见的AI都是基于云计算,就是得联网,由远处的服务器运算好了结果再将结果发回边缘设备,而TensorFlow Lite Micro的出现使得边缘的MCU能自主进行机器学习运算,即智能化,这是非常不可思议的。如今全球MCU已经部署超过2000亿,数量将继续指数级上升。如果这些边缘传感器都能运行机器学习算法,升级为智能传感器,AIoT和边缘计算将更加普及,整个世界将更加智能。

为何不直接使用TensorFlow模型

一个常规的ML模型包括以下功能:
Data loading、Scripting Interface、Cloud Serving、Metric Visualizer、Model Optimization、Labeling Tools、Feature Generation、Training Loop、Variable Storage、Distributed Compute、Math Library。
(数据加载,脚本接口,云服务,度量可视化工具,模型优化,标签工具,特征生成,训练循环,变量存储,分布式计算,数学库)
看着都很多很复杂对不对,看着就很占内存,事实确实如何,很多google的工程师之前也尝试过,结果表明正常训练好的tensorflow模型对于资源受限的边缘设备来说太大了,构建所需要的所有依赖关系和优化这么大的代码库是痛苦而困难的,即使这个模型大小合适,还有一系列的导出问题。为了缩小模型,我们可以删除反向传播、数据加载、特征生成组件等功能,将变量转换为常量,模型优化等等。
最终google实现了利用tensorflow lite使得手机或MCU上的ML框架只有:Math Library,为导入MCU增添了可能,但是还是有很多挑战。

Challenges(挑战)

将正常model转入MCU中面临很多挑战:

  • 正常模型中的权重是存储在变量中,但转换后的文件里面没有变量这个操作
  • 输入的特征需要被计算
  • 正常模型中有些结构部分用脚本语言表示
  • 分布式计算是图的一部分
  • 数据加载是图的一部分
  • 反向传播是图的一部分
  • 在训练过程中有不起作用的推理

所以编写一个将大型model转换为小型的运行在边缘端的model的转换器将会非常困难,我们需要在训练之前就做好相对应的对策。

模型转换

一个tensorflow训练好的模型会按一下步骤转换为TFLite模型

在python中转换的代码就两行:

上面简单的两行代码里完成了这些操作:

  1. 将TensorFlow操作转换为TF Lite等价表示。
  2. 移除反向传递、数据加载、调试、分布式计算和特征生成等操作! 训练图除了我们进行预测所需要的推断部分外,还有很多内容。去除所有无关的成分意味着理解不同比特的含义,而不是仅仅把它当作一个数学运算图。这意味着,如果我们能够在构建模型时继承关于开发人员意图的信息,我们通常可以提供更好的支持。所执行的数学运算列表是汇编程序级别,为了有效地转换(并提供有意义的调试信息),我们必须将其与用户熟悉的脚本语言连接起来。
  3. 将权重都变成常数! 神经网络中的权重在训练过程中不断更新,因此它们被存储在变量中。还有其他的值也存储在变量中,比如全局步长或动量信息。在TensorFlow中,完全连接或卷积的输入也可能是变量以外的东西,但这在TF Lite中不支持。导出程序必须解决这些问题,并输出一个文件,其中包含所有权重、形状和其他对推断很重要的变量,并存储为常量。
  4. 模型性能优化。 优化批量规范化和其他纯训练结构,量化、剪枝、权重聚集等
  5. 从拓扑学角度对图进行执行顺序排序。 TensorFlow图存储为节点和边的网络,表示操作之间的输入依赖关系。在训练过程中,遍历有向图是必要的,因为可能会有动态的变化。推断的顺序是固定的,因此我们将图转换为要执行的操作的有序列表。所以我们的解释器可以是一个简单的循环,对所有操作进行迭代。但是这意味着像控制流或条件执行这样的概念不能很好地被我们表示。

模型导出为MCU能识别的文件

在手机上,我们可以使用flatbuffer,一个超轻量的序列表示工具。(需要文件系统)

嵌入式设备通常没有文件系统,所以我们将文件转换为C数据数组,并将其编译为可执行文件。我们使用Linux命令xxd来完成这个转换:

TF Lite怎么在MCU上运行

主要是靠tensorflow lite里面的interpreter(解释执行器),针对移动小型设备专门优化、更少的依赖库、文件更小、快速加载、静态内存规划、静态执行规划。它会为model分配所需的空间(空间由我们自己定义,如果太小会报错)、循环文件中的操作、调用invoke函数等等。
还有kernal和registration等操作,大家可以去arduino里装一个tensorflowlite的库,找个实例看看,百来行的代码,很快就上手。
如果想体验基于tensorflow lite实现嵌入式机器学习,可以去康康我的另一篇 最简单体验TinyML、TensorFlow Lite。

TensorFlow Lite Micro简介与使用相关推荐

  1. 水果图像识别:基于 Arduino 和 TensorFlow Lite Micro

    特邀博文 / Dominic Pajak 和 Sandeep Mistry,来自 Arduino 团队 Arduino 肩负着让任何人均可轻松使用机器学习的使命.去年前,我们宣布 TensorFlow ...

  2. python tensorflow 智能家居_机器学习助力智能家居,支持ESP32的 TensorFlow Lite Micro 现已发布!...

    ESP32 简介:Wi-Fi MCU 我们很高兴宣布设备端机器学习框架 TensorFlow Lite 已支持 ESP32 芯片组,可进一步减轻 TensorFlow Lite Micro 的工作负载 ...

  3. 案例分享 | CEVA 使用 TensorFlow Lite 在边缘设备部署语音识别引擎及前端

    客座博文 / Ido Gus,来自 CEVA CEVA 是无线连接和智能传感技术的领先授权商.我们的产品可帮助原始设备制造商 (OEM) 为移动设备.消费者.汽车.机器人.工业和物联网等多种终端市场, ...

  4. 基于Zephyr在微型MCU上使用Tensor Flow Lite Micro做图像分类

    首先需要保证你已经拥有了一个图像分类的模型. 其次我们需要Zephyr RTOS. 这些可以参考如下文章: 基于Stm32F746g_disg平台下移植zephry使用TinyML预测模型_17岁bo ...

  5. 【社区分享】专注移动端机器学习交流,TensorFlow Lite 中文兴趣小组招募中!

    移动端机器学习的交流平台,TensorFlow Lite 的中文兴趣小组来啦!不论您是刚刚接触 TensorFlow Lite 的新手,或是已经在使用 TensorFlow Lite 的开发者,还是想 ...

  6. 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介...

    平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...

  7. GPU accelerated TensorFlow Lite / TensorRT applications - 3D Handpose project(Part A)项目简介

    目录 1. Introduction ​2. How to Build & Run 2.1. Build for x86_64 Linux 2.2. Build for aarch64 Lin ...

  8. TensorFlow Lite简介

    组成 TendorFlow Lite转换器:用于将已经存在的模型转换为TensorFlow Lite兼容的模型(.tflite),并将训练的模型保存在硬盘上.还可以在移动或者嵌入式应用程序中使用提前训 ...

  9. GitHub上用于微控制器的TensorFlow Lite

    这是TensorFlow Lite的实验端口,针对微控制器和其他只有千字节内存的设备.它不需要任何操作系统支持,任何标准的C或C ++库或动态内存分配,因此它的设计甚至可以移植到"裸机&qu ...

最新文章

  1. 自动识别文字的编码以及读取所有文本——VB2005
  2. matlab实现瑞利信道需要的步骤,基于Matlab的瑞利信道仿真.docx
  3. 二、CSS知识总结(上篇)
  4. 16 bit float 存储_面试官问我存储金额应该用哪种数据类型,我竟这样回答
  5. 今年新增院士中,最年轻的是他
  6. C与C++编译的区别 C和C++混合编译
  7. ERC20合约标准详解分析
  8. jq监听页面的滚动事件,
  9. 中国凝血测试耗材行业市场供需与战略研究报告
  10. 【转】snmpwalk命令常用方法
  11. Confluence 6 修改日志文件的大小数量和级别
  12. [BZOJ4539][HNOI2016]树(主席树)
  13. 大话数据结构 前言
  14. codeblocks安装教程和文件的简单创建方法
  15. java分布式事务框架_Java分布式事务,及解决方案
  16. mysql chinanet外网连接不上_笔记本电脑无法连接到ChinaNet无线网络怎么解决?
  17. Internal Server Error, Malformed UTF-8 characters, possibly incorrectly encoded
  18. 【CloudShell】阿里云壳EDR卸载指南
  19. 新手学编程前端好还是后端?
  20. ps怎样将一块地方,覆盖成自己想要替换的东西

热门文章

  1. 扩展Mybatis,免配XML文件自动实现增删改和随意查询
  2. 【KMP】【模板】【例题】回文大师
  3. Redis—主从配置
  4. 登录Windows后自动注销,原来中了pcidump.sys,scvhost.exe,SoundxVolumns.dll,kav32.exe等
  5. C++网络基础知识面试题1
  6. 2016脑力高危职业榜出炉,高薪与高危同在?
  7. 微信小程序wx.showModal(不显示“取消”按钮,修改“确定”按钮名称)
  8. HTML5笔记总结(二)
  9. Qt embeded 4.5.3 在ARM-Linux的移植
  10. PES2008 [实况11] 即将出炉