| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> TensorFlow Lite for Microcontrollers -> 正文阅读 |
|
[人工智能]TensorFlow Lite for Microcontrollers |
使用方法参考tensorflow/lite/micro/examples/xxx 目录下的使用方法, 以hello_world为例, 文件hello_world_test.cc 1. 创建MicroErrorReporter objecttflite::MicroErrorReporter micro_error_reporter; 2.? 有tflite model文件得到 tflite::Modle 结构体const tflite::Model* model = ::tflite::GetModel(g_model); 3. 创建OpsResolver对象这里是创建包含所有算子的对象 tflite::AllOpsResolver resolver; 如果是根据实际使用的算子创建OpsResolver, 使用 ? ? static tflite::MicroMutableOpResolver<5> micro_op_resolver;? 4. 提供一段连续的内存,用于model的内存(placement new)uint8_t tensor_arena[tensor_arena_size]; 5. 创建MicroInterpreter对象? MicroInterpreter(const Model* model, const MicroOpResolver& op_resolver, tflite::MicroInterpreter interpreter( 6. 为所有的Tensor/ScratchBuffer分配内存,为所有支撑的变量分配内存等interpreter.AllocateTensors(); //因内存的大小是个超参数常量,可以通过使用情况调整下,如参考arena_used_bytes() interpreter.arena_used_bytes(); 7. 得到输入对应的TensorTfLiteTensor* input = interpreter.input(0); 检测input tensor的一些属性 TF_LITE_MICRO_EXPECT_EQ(2, input->dims->size); // other). 8. Provide an input value赋值input tensor
9. 进行推断interpreter.Invoke(); 10. 得到推断结果// Obtain a pointer to the output tensor and make sure it has the //检测推断结果的属性 按上面的步骤,分析下代码实现, 尽量明白一个 AIEngine reference的实现。 ErrorReporterErrorReport class 是用来输出log, 各个平台如PC/ 串口打印log的具体实现不同,使用虚函数继承是合理的,接口类Class ErrorReporter:lite/core/api/error_report.h 虚函数是virtual int Report(const char*, va_list args), 普通成员函数调用虚函数也得到了跨平台的接口。 对外的接口是个宏: 其中... 表示所有输入 #define TF_LITE_REPORT_ERROR(reporter, ...)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\ TF_LITE_REPORT_ERROR(error_reporter_, 展开为: static_cast<tflite::ErrorReporter*>(reporter)->Report(Tensor index %d", index); 强制类型转换 static_cast<tflite::ErrorReporter*>(reporter) 把reporter转换为基类,调用函数Report(const char* format, ...) 而Report的实现又调用虚函数得到log的具体实现。 tflite::ModelModel文件包含的数据包括: subgraphs(子图) 每个子图中包括输入、输出的tensor索引号和tensors model的buffer里保存的是tensor相关的数据,model的operator_codes里包括了每个算子的具体信息如op_code(操作码),算子的input/oupt(tensor的索引号),算子的custom/builtin data. 模型的量化信息, ?OpResolver算子决议,根据opcode找到具体的实现 ?算子的决议实现方法是 调用AddBuiltin把opcode和对应的TfLiteRegistration, BuiltinParseFunction注册到数组中,最后通过GetRegistrationFromOpCode得到对应的TfLiteRegistration。 tf:Model中的算子在代码里表示NodeAndRegistration 或者说是算子的输入和算子的执行体 MicroInterpreter构造函数MicroInterpreter::MicroInterpreter(const Model* model, MicroAllocatorMicroAllocator的作用是从arena中分配内存,具体实现是成员变量?class SimpleMemoryAllocator 这是代码最复杂的部分,下面会详述 ContextHelperContextHelper是为to encapsulate the implementation of APIs in Context. TfLiteContext包含了不少函数指针,ContextHelper封装这些函数的实现,或者说提供了这些函数的实现。 context_.AllocatePersistentBuffer = context_helper_.AllocatePersistentBuffer; context_.RequestScratchBufferInArena = context_helper_.RequestScratchBufferInArena; context_.GetScratchBuffer = context_helper_.GetScratchBuffer; MicroInterpreter::AllocateTensors()?AllocateTensors之所以这么复杂,是为了内存的复用,如算子1:tensor占用的内存,到算子3时如果不用了,这块内存就可以复用,怎样知道那些可以复用也就是内存 planner 的实现GreedyMemoryAllocator 贪婪算法。 引入TfLiteEvalTensor为了减少Memory的使用引入了TfLiteEvalTensor 保留了op必须使用的成员 ?SimpleMemoryAllocator?SimpleMemoryAllocator 管理一个线性数组(memory arena) memory 分为3部分: head(scratch buffer: GreedyMemoryPlanner策略的内存), tail(persistent 部分,内容的生命周期 persistent), temp(head, tail间的内存,使用后马上释放部分) online/offlinememory 怎么plann是怎么得到?一种方法是offline 也就是 model文件的meta data里已经提供memory plann, 而online是 MicroInterpreter根据model 文件的内容 online进行计算得到memory planner Tensors are allocated differently depending on the type of tensor. Weight tensors are located in the flatbuffer, which is allocated by the application that calls TensorFlow Lite Micro. EvalTensors are allocated in the tensor arena, either offline planned as specified in the flatbuffers metadata, or allocated during runtime by the?memory planner?(online planned). The tensor arena is allocated by MicroAllocator in TensorFlow Lite Micro, and the model buffer (represented by a .tflite-file) is allocated by the application using TensorFlow Lite Micro. ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 8:34:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |