Tensor Flow Lite C++ API 介绍
目录
Class类介绍
tflite::ErrorReporter
头文件路径
类作用
Public API介绍
示例
tflite::FlatBufferModel
头文件路径
类作用
Public Static API介绍
Public API介绍
示例
tflite::Interpreter
头文件路径
类作用
Public 类型
Public Static 属性变量
Friend 类
Public API介绍
示例
tflite::InterpreterBuilder
头文件路径
类作用
Public API介绍
备注
tflite::OpResolver
头文件路径
Public 类型
备注
Class类介绍
类名 |
作用 |
---|---|
tflite::ErrorReporter | 用于汇报错误,当发生错误时可以通过此类获取错误信息 |
tflite::FlatBufferModel | 用于序列化模型 |
tflite::Interpreter | 从张量输入和输出的节点图的解释器 |
tflite::InterpreterBuilder | 构建一个能够解释模型的解释器 |
tflite::OpResolver | 给定操作码或自定义操作名称返回 TfLiteRegistrations 的抽象接口 |
tflite::ErrorReporter
头文件路径
#include <error_reporter.h>
类作用
用于汇报错误,当发生错误时可以通过此类获取错误信息
Public API介绍
函数原型 |
作用 |
返回值 |
---|---|---|
Report(const char *format, ...) |
向错误日志输出一串字符串 | VOID |
ReportError(void *, const char *format, ...) |
将字符串输出到指定位置 | VOID |
示例
调用类似于 printf。
用法:ErrorReporter foo; foo.Report("测试%d", 5); 或 va_list 参数; foo.Report("test %d", args); // 其中 args 是 va_list
子类 ErrorReporter 以提供另一个报告目标。 例如,如果您有一个 GUI 程序,您可能会重定向到驱动 GUI 错误日志框的缓冲区。
//输出数据
ErrorReporter foo;
foo.Report("测试%d", 5);
tflite::FlatBufferModel
头文件路径
#include <model_builder.h>
类作用
用于序列化模型
Public Static API介绍
函数原型 |
返回值 |
作用 |
---|---|---|
FlatBufferModel(const FlatBufferModel &) |
void |
构造函数 |
~FlatBufferModel() |
void |
析构函数 |
BuildFromAllocation(std::unique_ptr< Allocation > allocation, ErrorReporter *error_reporter) |
std::unique_ptr< FlatBufferModel > |
直接从分配中构建模型 |
BuildFromBuffer(const char *caller_owned_buffer, size_t buffer_size, ErrorReporter *error_reporter) |
std::unique_ptr< FlatBufferModel > |
基于预加载的 flatbuffer 构建模型 |
BuildFromFile(const char *filename, ErrorReporter *error_reporter) |
std::unique_ptr< FlatBufferModel > |
基于文件构建模型 |
BuildFromModel(const tflite::Model *caller_owned_model_spec, ErrorReporter *error_reporter) |
std::unique_ptr< FlatBufferModel > |
直接从 flatbuffer 指针构建模型调用者保留缓冲区的所有权,并应使其保持活动状态,直到返回的对象被销毁 |
VerifyAndBuildFromAllocation(std::unique_ptr< Allocation > allocation, TfLiteVerifier *extra_verifier, ErrorReporter *error_reporter) |
std::unique_ptr< FlatBufferModel > |
验证分配的内容是否合法,然后根据提供的分配构建模型 |
VerifyAndBuildFromBuffer(const char *caller_owned_buffer, size_t buffer_size, TfLiteVerifier *extra_verifier, ErrorReporter *error_reporter) |
std::unique_ptr< FlatBufferModel > |
验证缓冲区的内容是否合法,然后根据预加载的 flatbuffer 构建模型 |
VerifyAndBuildFromFile(const char *filename, TfLiteVerifier *extra_verifier, ErrorReporter *error_reporter) |
std::unique_ptr< FlatBufferModel > |
验证文件内容是否合法,然后基于文件构建模型 |
Public API介绍
函数原型 |
返回值 |
作用 |
---|---|---|
函数原型 |
返回值 |
作用 |
CheckModelIdentifier() const | bool | 如果模型标识符正确则返回真(否则为假并报告错误) |
GetMinimumRuntime() const | std::string | 获取最小运行时间 |
GetModel() const | const tflite::Model * | 获取序列化的模型指针 |
allocation() const | const Allocation * | 获取分配的内存空间 |
error_reporter() const | ErrorReporter * | 获取错误报告类指针 |
initialized() const | bool | 初始化 |
operator->() const | const tflite::Model * | ->操作符实现 |
operator=(const FlatBufferModel &)=delete | FlatBufferModel & | =操作符实现 |
示例
这使用 flatbuffers 作为序列化格式。
注意:当前的 API 要求客户端保持 FlatBufferModel 实例处于活动状态,只要它被任何依赖的 Interpreter 实例使用。 由于 FlatBufferModel 实例在创建后实际上是不可变的,因此客户端可以安全地使用具有多个依赖 Interpreter 实例的单个模型,甚至跨多个线程(但请注意,每个 Interpreter 实例都不是线程安全的)。
using namespace tflite;
StderrReporter error_reporter;
auto model = FlatBufferModel::BuildFromFile("interesting_model.tflite",&error_reporter);
MyOpResolver resolver; // 你需要继承 OpResolver 以提供实现InterpreterBuilder builder(*model, resolver);
std::unique_ptr interpreter;
if(builder(&interpreter) == kTfLiteOk) {//.. run model inference with interpreter
}
tflite::Interpreter
头文件路径
#include <interpreter.h>
类作用
从张量输入和输出的节点图的解释器
Public 类型
变量名 |
原型 |
作用 |
---|---|---|
TfLiteDelegatePtr |
using std::unique_ptr< TfLiteDelegate, void(*)(TfLiteDelegate *)>
|
委托类型 |
Public Static 属性变量
变量名 |
返回值 |
作用 |
---|---|---|
kTensorsCapacityHeadroom = 16 | constexpr int | 在调用 ops 的准备和调用函数之前 tensors_ 向量的容量余量 |
kTensorsReservedCapacity = 128 | constexpr int | 张量预留容量 |
Friend 类
类名 |
---|
tflite::InterpreterTest |
tflite::delegates::InterpreterUtils |
tflite::delegates::test_utils::TestDelegation |
Public API介绍
函数原型 |
返回值 |
作用 |
---|---|---|
函数原型 |
返回值 |
作用 |
AllocateTensors() |
TfLiteStatus |
获取TfLiteStatus副本 |
EnsureTensorDataIsReadable(int tensor_index) | TfLiteStatus | 确保 tensor.data 中的数据可读 |
GetAllowFp16PrecisionForFp32() const | bool | 获取半精度标志 |
GetBufferHandle(int tensor_index, TfLiteBufferHandle *buffer_handle, TfLiteDelegate **delegate) | TfLiteStatus | 获取委托缓冲区句柄,以及可以处理缓冲区句柄的委托 |
GetInputName(int index) const | const char * | 返回给定输入的名称 |
GetOutputName(int index) const | const char * | 返回给定输出的名称 |
GetProfiler() | Profiler * | 获取用于操作跟踪的探查器 |
Invoke() | TfLiteStatus | 调用解释器(按依赖顺序运行整个图) |
ModifyGraphWithDelegate(TfLiteDelegate *delegate) | TfLiteStatus | 允许委托查看图形并修改图形以自行处理图形的某些部分 |
ModifyGraphWithDelegate(std::unique_ptr<Delegate,Deleter>delegate) | TfLiteStatus | 与 ModifyGraphWithDelegate 相同,但此解释器拥有提供的委托的所有权 |
ModifyGraphWithDelegate(std::unique_ptr< TfLiteDelegate > delegate)=delete | TfLiteStatus | 这种超载永远不会好 |
OpProfilingString(const TfLiteRegistration & op_reg, const TfLiteNode *node) const | const char * | 检索操作员对其工作的描述,用于分析目的 |
ReleaseNonPersistentMemory() | TfLiteStatus | 警告:实验界面,可能会发生变化 |
ResetVariableTensors() | TfLiteStatus | 将所有变量张量重置为默认值 |
ResizeInputTensor(int tensor_index, const std::vector< int > & dims) | TfLiteStatus | 改变给定张量的维度 |
ResizeInputTensorStrict(int tensor_index, const std::vector<int> & dims) | TfLiteStatus | 需要调用 AllocateTensors() 来更改张量输入缓冲区 |
SetAllowBufferHandleOutput(bool allow_buffer_handle_output) | void | 设置是否允许缓冲区句柄输出 |
SetAllowFp16PrecisionForFp32(bool allow) | void | Allow float16 precision for FP32 calculation when possible |
SetBufferHandle(int tensor_index, TfLiteBufferHandle buffer_handle, TfLiteDelegate *delegate) | TfLiteStatus | 将委托缓冲区句柄设置为张量 |
SetCancellationFunction(void *data, bool(*)(void *) check_cancelled_func) | void | 设置取消函数指针,以便在调用 Invoke() 的过程中取消请求 |
SetCustomAllocationForTensor(int tensor_index, const TfLiteCustomAllocation & allocation, int64_t flags) | TfLiteStatus | 为张量设置自定义位置 |
SetExternalContext(TfLiteExternalContextType type, TfLiteExternalContext *ctx) | void | 设置外部上下文 |
SetNumThreads(int num_threads) | TfLiteStatus | 设置解释器可用的线程数 |
SetProfiler(Profiler *profiler) | void | 将探查器设置为跟踪执行 |
SetProfiler(std::unique_ptr< Profiler > profiler) | void | 与 SetProfiler 相同,但此解释器拥有提供的分析器的所有权 |
execution_plan() const | const std::vector< int > & | 执行计划 |
input_tensor(size_t index) | TfLiteTensor * | 返回一个指向给定输入张量的可变指针 |
input_tensor(size_t index) const | const TfLiteTensor * | 返回一个指向给定输入张量的不可变指针 |
input_tensor_by_signature_name(const char *signature_input_name, const char *signature_method_name) | TfLiteTensor * | 警告:实验性接口,可能会更改返回由“signature_method_name”标识的签名中由“signature_input_name”标识的输入张量 |
inputs() const | const std::vector< int > & | 对输入列表的只读访问权限 |
node_and_registration(int node_index) const | const std::pair< TfLiteNode, TfLiteRegistration > * | 如果在边界内,则获取指向操作和注册数据结构的指针 |
nodes_size() const | size_t | 返回模型中的操作数 |
operator=(const Interpreter &)=delete | Interpreter & | =重载运算符 |
output_tensor(size_t index) | TfLiteTensor * | 返回一个指向给定输出张量的可变指针 |
output_tensor(size_t index) const |
|
返回一个指向给定输出张量的不可变指针 |
output_tensor_by_signature_name(const char *signature_output_name, const char *signature_method_name) const | const TfLiteTensor * | 警告:实验性接口,可能会更改返回由“signature_method_name”标识的签名中由“signature_output_name”标识的输出张量 |
outputs() const | const std::vector< int > & | 只读访问输出列表 |
signature_def_names() const | std::vector< const std::string * > | 警告:实验性接口,可能会更改返回模型中定义的不同方法签名的所有名称的列表 |
signature_inputs(const char *method_name) const | const std::map< std::string, uint32_t > & | 警告:实验性接口,可能会发生变化返回输入到通过“method_name”指定的签名中的张量索引的映射 |
signature_outputs(const char *method_name) const | const std::map< std::string, uint32_t > & | 警告:实验性接口,可能会发生变化返回输出到通过“method_name”指定的签名中的张量索引的映射 |
tensor(int tensor_index) | TfLiteTensor * | 获取可变张量数据结构 |
tensor(int tensor_index) const | const TfLiteTensor * | 等一个不可变的张量数据结构 |
tensors_size() const | size_t | 返回模型中张量的数量 |
typed_input_tensor(int index) | T * | 将输入量量返回给定输入的数据中 |
typed_input_tensor(int index) const | const T * | 返回一个指向给定输入张量数据的不可变指针 |
typed_output_tensor(int index) | T * | 返回指向给定输出张量数据的可变指针 |
typed_output_tensor(int index) const | const T * | 返回一个指向给定输出张量数据的不可变指针 |
typed_tensor(int tensor_index) | T * | 对适当的张量类型(可变指针版本)执行检查转换 |
typed_tensor(int tensor_index) const | const T * | 对适当的张量类型(不可变指针版本)执行检查转换 |
variables() const | const std::vector< int > & | 只读访问变量张量列表 |
示例
图的每个节点处理一组输入张量并产生一组输出张量。 所有输入/输出张量都由索引引用
// 从文件创建模型
// 注意,模型实例必须比解释器实例存活时间更长
auto model = tflite::FlatBufferModel::BuildFromFile(...);
if (model == nullptr) {// 返回错误
}
// Create an Interpreter with an InterpreterBuilder.
std::unique_ptr interpreter;
tflite::ops::builtin::BuiltinOpResolver resolver;
if (InterpreterBuilder(*model, resolver)(&interpreter) != kTfLiteOk) {// 返回失败
}
if (interpreter->AllocateTensors() != kTfLiteOk) {
// 返回失败
}auto input = interpreter->typed_tensor(0);
for (int i = 0; i < input_size; i++) {input[i] = ...; interpreter.Invoke();
tflite::InterpreterBuilder
头文件路径
#include <interpreter_builder.h>
类作用
构建一个能够解释模型的解释器
Public API介绍
AddDelegate(TfLiteDelegate *delegate) | void | 任何使用 AddDelegate 添加的委托都将按添加顺序应用于由 operator() 生成的解释器 |
PreserveAllTensorsExperimental() | InterpreterBuilder & | 启用保留中间体以进行调试 |
SetNumThreads(int num_threads) | TfLiteStatus | 设置用于解释器的 CPU 线程数 |
operator()(std::unique_ptr< Interpreter > *interpreter) | TfLiteStatus | 构建一个解释器并将其存储在 *interpreter 中 |
operator()(std::unique_ptr< Interpreter > *interpreter, int num_threads) | TfLiteStatus | 与上面相同,但还设置要使用的 CPU 线程数(覆盖之前对 SetNumThreads 的任何调用) |
operator=(const InterpreterBuilder &)=delete | InterpreterBuilder & | =重载运算符 |
备注
生命周期必须至少与构建器创建的任何解释器一样长的模型。原则上,多个解释器可以由单个模型构成。 op_resolver:实现 OpResolver 接口的实例,它将自定义操作名称和内置操作代码映射到操作注册。提供的 op_resolver 对象的生命周期必须至少与 InterpreterBuilder 一样长;与 model 和 error_reporter 不同, op_resolver 不需要在任何创建的 Interpreter 对象的持续时间内存在。 error_reporter:一个被调用来报告处理 printf var arg 语义的错误的函子。 error_reporter 对象的生命周期必须大于或等于由 operator() 创建的 Interpreter。
成功时返回 kTfLiteOk 并将解释器设置为有效的解释器。注意:用户必须确保模型(和错误报告器,如果提供)的生命周期至少与解释器的生命周期一样长,并且单个模型实例可以安全地与多个解释器一起使用。
tflite::OpResolver
头文件路径
#include <op_resolver.h>
类作用
给定操作码或自定义操作名称返回 TfLiteRegistrations 的抽象接口
Public 类型
变量名 |
原型 |
作用 |
---|---|---|
变量名 |
原型 |
作用 |
TfLiteDelegatePtrVector |
usingstd::vector< std::unique_ptr< TfLiteDelegate, void(*)(TfLiteDelegate *)>>
|
委托 Ptr 向量 |
Public API介绍
~OpResolver() | void | 析构函数 |
FindOp(tflite::BuiltinOperator op, int version) const =0 | virtual const TfLiteRegistration * | 通过枚举代码查找内置运算符的操作注册,纯虚函数用户必须继承然后实现这个方法 |
FindOp(const char *op, int version) const =0 | virtual const TfLiteRegistration * | 按操作名称查找自定义运算符的操作注册,纯虚函数用户必须继承然后实现这个方法 |
GetDelegates(int num_threads) const | virtual TfLiteDelegatePtrVector | 获取委托 |
备注
这是在 flatbuffer 模型中引用的操作映射到可执行函数指针 (TfLiteRegistrations) 的机制
Tensor Flow Lite C++ API 介绍相关推荐
- TinyML与Tensor Flow Lite的关系
目录 发展历史 简介 Tensor Flow Lite for Microcontrollers 主要模块 发展历史 Tensor Flow Lite是针对移动设备以及可穿戴设备领域的深度学习框架,是 ...
- 基于Zephyr在微型MCU上使用Tensor Flow Lite Micro做图像分类
首先需要保证你已经拥有了一个图像分类的模型. 其次我们需要Zephyr RTOS. 这些可以参考如下文章: 基于Stm32F746g_disg平台下移植zephry使用TinyML预测模型_17岁bo ...
- 什么是Tensor Flow和lite以及数据流图
目录 概述 发展历史 数据流图 基本架构 概述 Tensor Flow是谷歌Google Brain实验室维护开发的,它于2015年11月9日发布第一个初始版本,遵循Apache 2.0开源协议,经过 ...
- SAP CRM 和 Cloud for Customer 的 Document flow API 介绍
Document flow API in CRM 以一个具体的例子来说明.在Appointment的Overview page上能看见一个名叫Reference的区域,这里可以维护一些其他的业务文档的 ...
- Tensor Flow V2:将Tensor Flow H5模型文件转换为tflite
目录 H5模型文件介绍 Tflite模型文件介绍 转换代码 H5模型文件介绍 h5文件全称HDF5,是Tensor Flow2.0新增的文件模型,它保存了训练时的所有参数包括权重等特征信息,与其它模型 ...
- Tensor Flow V2:基于Tensor Flow Keras的摄氏度到华氏度温度转换的训练模型
理论知识 神经网络全连接层详解_17岁boy的博客-CSDN博客 什么是Tensor Flow和lite以及数据流图_17岁boy的博客-CSDN博客 什么是Keras? Keras是一个 ...
- MindSpore Lite整体架构介绍
MindSpore Lite整体架构介绍 MindSpore Lite框架的总体架构如下所示: • 前端(Frontend): 负责模型生成,用户可以通过模型构建接口构建模型,将第三方模型和MindS ...
- 43_pytorch nn.Module,模型的创建,构建子模块,API介绍,Sequential(序号),ModuleList,ParameterList,案例等(学习笔记)
1.40.PyTorch nn.Module 1.40.1.模型的创建 1.40.2.构建子模块 1.40.3.nn.Module API介绍 1.40.3.1.核心功能 1.40.3.2.查看模块 ...
- python输入参数改变图形_Python基于Tensor FLow的图像处理操作详解
本文实例讲述了Python基于Tensor FLow的图像处理操作.分享给大家供大家参考,具体如下: 在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数 ...
最新文章
- 递归方法:对于树形结构的表,根据当前数据获取无限极的父级名称
- 《Linux防火墙(第4版)》——1.3 传输层机制
- 大话数据结构22:几种常见的静态查找算法
- vue 实例化几种方式_vue注册组件的几种方式总结
- 为啥这么多程序员大佬学习Cortex-M3
- C语言fwrite函数了解
- 《算法导论》学习笔记——快速排序
- 第十三节:易学又实用的新特性:for...of
- perl语言学习笔记(3)列表与数组、子程序’、参数
- _临武县组合式桥梁伸缩缝F型伸缩缝—批发
- 微课|中学生可以这样学Python(例7.3):栈
- 如何断开GitLab远程仓库链接
- VBS去除字符串的重复项并统计重复字符出现的次数
- AlphaGo真的赢了么?
- php7 mysql部署_windows上apache+php+mysql环境部署(php7安装失败,勿模仿!!)
- 小仲马《茶花女》读后感
- 数据模型的概念,数据模型的作用和数据模型的三个要素
- 除了 Microsoft Office我们还可以选择哪些软件?
- 深度学习入门 (九):卷积层和池化层的实现
- 当下非常火的VR全景展示到底是什么?
热门文章
- mysql 存储过程写入文件
- python闭包和函数调用区别_python – 函数闭包与可调用类
- three几何线在mapbox地图显示
- zuul网关_SpringCould之服务网关(zuul)介绍与配置
- IDEA 控制台显示Run Dashboard
- cad抛物线lisp程序_数控车宏程序编程实用干货,全在这里了...
- css鼠标拖拉卡顿_66个值得收藏的CSS开发技巧
- php 模板 自己,php自己写了一个模板
- python3的配置文件类单例实现_单例模式的几种实现方式及对比
- python中int和float的区别_Python学习(四)数据结构 —— int float