在tensorfow lite中对各op进行单元测试

本文详细介绍如何在ARM嵌入式平台上对TensorFlow Lite的OP进行单元测试,包括修改Makefile编译test_util.cc,使用Googletest库,以及编译conv_test.cc的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tensorflow lite源码中提供了对个op的单元测试源码,但是在官方的tflite Makefile中默认并没有编译该部分代码。本文主要是记录在tflite中对op进行单独测试的方法,平台为ARM嵌入式。

概要

在tflite的源码中单元测试的源码一般在op名后面添加有test,在目录 tensorflow/contrib/lite/kernels下可以看到很多op的单元测试源码,如convolution的实现源码为conv.cc,则对应的单元测试源码为conv_test.cc,查看源码后可以知道单元测试采用googletest来实现。另外,基本上所有op的单元测试都会继承tensorflow/contrib/lite/kernels/test_util.h里面的SingleOpModel类,而官方源码中的Makefile默认是没有编译test_util.cc的。
下面,本文以编译conv_test.cc为例说明怎么使用单元测试。

基本思想为:先修改Makefile把test_util.cc编译进libtensorflow-lite.a,然后对要测试的conv_test.cc源码单独写一个cmake去调用新的libtensorflow-lite.a

由于unit test需要用到Googletest库,所以需要提前编译准备好Googletest,另外还需要用到absl库。

安装Googletest库

git clone https://github.com/google/googletest 
cd googletest
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/path/to/yourdir ..
make install 

absl地址:https://github.com/abseil/abseil-cpp 先下载放到制定位置,可以暂时不用编译。

修改Makefile,编译新的tflite库

准备工作做好以后就可以修改lite源码中的Makefile了,修改的地方主要是添加googletest到INCLUDES,以及添加对其他源码的编译。

添加新的INCLUDES

INCLUDES += -I/path/to/googletest/include

修改CORE_CC_EXCLUDE_SRCS变量

CORE_CC_EXCLUDE_SRCS := \
$(wildcard tensorflow/contrib/lite/*test.cc) \
$(wildcard tensorflow/contrib/lite/*/*test.cc) \
$(wildcard tensorflow/contrib/lite/*/*/*test.cc) \
$(wildcard tensorflow/contrib/lite/*/*/*/*test.cc) 
##$(wildcard tensorflow/contrib/lite/kernels/test_util.cc) \   把这行注释掉

另外还需要添加

CORE_CC_ALL_SRCS += \
$(wildcard tensorflow/core/platform/default/logging.cc) \
$(wildcard tensorflow/core/platform/env_time.cc)

到此,对Makefile的修改就完成了,运行./tensorflow/contrib/lite/tools/make/build_rpi_lib.sh编译可生成新的libtensorflow-lite.a库。

Tips: 注意上述编译的库在被conv_test.cc调用时会出错,原因是env_time.cc中的 EnvTime类部分函数还没有实现,这个可以自己把相关函数实现下,可以参考 tensorflow/core/platform/posix/env_time.cc的实现方式。

编译conv_test.cc

接下来编译conv_test.cc,编译CMAKE的时候遇到一些坑,下面是填坑后的完整CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
add_definitions(-std=c++11)  #must use c++11
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(GCC_COMPILER_VERSION "" STRING "GCC Compiler version")

SET(CMAKE_C_COMPILER   aarch64-linux-gnu-gcc) 
SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) 
find_package(Threads)
SET(CMAKE_BUILD_TYPE "Release")
#set(CMAKE_EXE_LINKER_FLAGS "-lpthread -lrt -ldl") #special for tflite compile
INCLUDE_DIRECTORIES("/path/to/tflite_lib/include")
INCLUDE_DIRECTORIES("/path/to/googletest/include")
INCLUDE_DIRECTORIES("/path/to/absl")

LINK_DIRECTORIES("/path/to/tflite/lib")
LINK_DIRECTORIES("/path/to/googletest/lib")

add_executable(ConvUnitTest conv_test.cc)
target_link_libraries(ConvUnitTest libtensorflow-lite.a libgtest.a libgmock.a ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS})

如果需要对其他的op进行单元测试,则把对应的op_test.cc替换掉上面的conv_test.cc即可。

<think>我们参考了用户提供的引用内容,特别是引用[1]和[3]中关于TensorFlowLite部署的流程。用户明确希望了解如何使用TensorFlowLite将模型部署到移动端(Android/iOS)。根据引用内容,部署流程主要包括三个步骤:模型转换、模型优化和移动端集成。我们将按照以下结构组织回答:1.模型转换:将TensorFlow模型转换为TensorFlowLite格式(.tflite)2.模型优化:使用量化等技术优化模型,以减小模型体积和提升推理速度3.移动端集成:分别介绍Android和iOS平台集成TFLite模型的方法4.性能监控与调试:简要介绍如何监控模型在移动端的性能注意:引用[3]提供了一个转换代码示例,我们将引用该代码并解释。同时,我们将生成相关问题。</think>### TensorFlow Lite移动端部署指南 以下流程基于引用内容[1][2][3],完整实现TensorFlow模型到移动端(Android/iOS)的部署: #### 1. **模型转换**(核心步骤) 将训练好的模型转换为`.tflite`格式: ```python import tensorflow as tf # 转换SavedModel格式(推荐) converter = tf.lite.TFLiteConverter.from_saved_model('./your_model_dir') converter.target_spec.supported_ops = [ tf.lite.OpsSet.TFLITE_BUILTINS, # 基础算子 tf.lite.OpsSet.SELECT_TF_OPS # 扩展算子支持[^3] ] tflite_model = converter.convert() # 保存为.tflite文件 with open("model.tflite", "wb") as f: f.write(tflite_model) ``` **关键参数**: - **量化压缩**:添加`converter.optimizations = [tf.lite.Optimize.DEFAULT]`可减小模型体积50-75%[^1] - **输入输出设置**:`converter.input_shape = [1, 224, 224, 3]` 指定输入维度 --- #### 2. **模型优化** | 优化技术 | 效果 | 适用场景 | |-------------------|-------------------------------|----------------------| | 动态范围量化 | 体积减小4倍,精度损失<1% | 通用模型[^1] | | 全整数量化 | 体积减小10倍,需校准数据集 | 实时推理(CPU/TPU) | | 剪枝+量化 | 体积减小20倍 | 超轻量级应用[^2] | --- #### 3. **移动端集成** **Android集成**(Java/Kotlin): ```java // 步骤1:将model.tflite放入assets文件夹 // 步骤2:添加依赖 implementation 'org.tensorflow:tensorflow-lite:2.9.0' // 步骤3:加载模型并推理 try (Interpreter interpreter = new Interpreter(loadModelFile(assetManager))) { float[][] input = preprocess(image); // 输入预处理 float[][] output = new float[1][10]; // 输出缓冲区 interpreter.run(input, output); // 执行推理 } ``` **iOS集成**(Swift): ```swift // 步骤1:导入TensorFlowLite框架 // 步骤2:加载模型 let modelPath = Bundle.main.path(forResource: "model", ofType: "tflite") var interpreter: Interpreter! interpreter = try Interpreter(modelPath: modelPath) // 步骤3:推理 try interpreter.allocateTensors() try interpreter.copy(inputData, toInputAt: 0) try interpreter.invoke() let output = try interpreter.output(at: 0) ``` --- #### 4. **性能监控与调试** - **基准测试**:使用[TFLite Benchmark Tool](https://www.tensorflow.org/lite/performance/measurement)评估延迟和内存 - **性能优化**: - 启用GPU代理:`Interpreter.Options().setUseGpu(true)`(Android) - 使用NNAPI:`interpreter.setUseNNAPI(true)`(支持高通DSP) - **日志分析**:通过Android Studio Logcat或Xcode控制台查看TFLite日志 --- ### 常见问题解决 1. **算子不支持**: - 检查转换时是否启用`SELECT_TF_OPS` - 使用[TFLite Op Compatibility](https://www.tensorflow.org/lite/guide/ops_compatibility)工具 2. **输入输出异常**: - 验证移动端预处理与训练时一致(如RGB/BGR顺序) - 使用`interpreter.getInputTensor(0).shape()`检查维度 > 部署完成后,建议通过TensorBoard Lite分析推理性能[^1],或使用Firebase Performance Monitoring进行实时监控[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值