通过观看视频,记下此次笔记,笔记内容来自lite深度解析视频。视频来源:https://www.bilibili.com/video/av24219725/
tensorflow lite 定位于设备端智能应用。我们在台式机上使用tensorflow开发出模型,训练出权重,然后使用转换工具,将模型转换为tensorflow lite的格式。在设备端,tensorflow的解析器会加载这个模型并且进行计算。lite内置NEON指令集,并且支持硬件加速接口。
1、模型文件格式
模型文件的主结构为model结构体,如下图所示:
结构体中的operator_codes:[OperatorCode];定义了该模型所用的算子。
结构体中的subgraph定义了各个子图,其中第一个子图是主图。
buffers是数据存储区域。主要用来存放模型权重。
1.1 subgraphs里面的具体内容
subgraphs定义了图的具体结构。
其中的tensor,定义了子图中的各个tensor。
其中的inputs和outputs,通过索引值的形式,定义了哪些tensor负责输入输出。
operators定义了子图的各个算子。
1.2 tensor具体结构
包含了维度信息、数据类型以及数据位置。
其中的buffer,通过索引值的形式,指出了此tensor使用了哪个buffer。
1.3 operator具体内容
其中的opcode_index通过索引值的形式,指明了改operator使用的具体算子。
inputs和outputs,指明了该operator的输入输出。
2 、解析器细节
数据流图可以用边和结点来表达。边就是tensor在结点对应的op进行操作输出进入另一个tensor。
首先模型文件通过mmap加载进内存,内存里有了tensor、operator以及buffer等内容。
其中,为了表示那些数值可变的tensor,增加了可写的buffer区域。
解析器,还包含了具体执行计算的代码,称之为kernal。
模型中的各个tensor,被加载为tflitetensor格式,集中存放于TfLiteContext中。
每个tensor的指针指向内存映射的只读数据区域,或新分配的可写数据区域。
模型中的operator被加载为TfLiteNode。包含了输入输出的tensor索引值。
Node对应的操作符存储于TfLiteRegistration,包含了指向kernal的指针。
OpResolver负责维护函数指针映射关系。
更多细节,在这几个代码文件。