TFLM Hello World示例中资源变量数量设置的疑问:为何设为24及估算方式
TensorFlow Lite Micro Hello World示例中资源变量的作用与数值估算
为什么要使用资源变量
在TFLM中,资源变量(Resource Variables) 用于存储模型运行时需要保留的状态数据,比如层的持久化参数、推理过程中的中间状态等。对于Hello World的正弦波预测模型来说,模型内全连接层的权重、偏置等参数会被包装成资源变量管理,确保推理时这些参数能稳定复用,避免重复初始化。
同时,TFLM的MicroResourceVariables组件是针对微控制器这类资源受限设备设计的,它将变量存储在预先分配的tensor arena中,避免动态内存分配带来的碎片化风险,这在嵌入式场景中至关重要。
数值24的估算方法
kNumResourceVariables = 24是根据Hello World模型的具体结构统计得出的:
- 拆解模型结构:该示例包含输入层、多个全连接层和输出层,每层的权重、偏置都会被视为独立的资源变量。
- 统计持久化张量数量:把所有层的权重张量、偏置张量,加上模型内部的辅助状态张量累加,总数刚好为24。
- 通用估算方法:如果不确定自己的模型需要多少资源变量,可以用
RecordingMicroAllocator跟踪内存分配,运行模型后打印分配日志,统计实际用到的资源变量数量,再将该数值设为kNumResourceVariables的取值。
相关代码片段
constexpr int kTensorArenaSize = 3000; uint8_t tensor_arena[kTensorArenaSize]; constexpr int kNumResourceVariables = 24; tflite::RecordingMicroAllocator* allocator( tflite::RecordingMicroAllocator::Create(tensor_arena, kTensorArenaSize)); tflite::RecordingMicroInterpreter interpreter( tflite::GetModel(g_hello_world_float_model_data), op_resolver, allocator, tflite::MicroResourceVariables::Create(allocator, kNumResourceVariables), &profiler);
内容的提问来源于stack exchange,提问作者Spitfire1.2
相关产品推荐
相关产品推荐

