首页
/ MNN项目中如何将std::vector转换为Tensor对象

MNN项目中如何将std::vector转换为Tensor对象

2025-05-22 23:08:12作者:贡沫苏Truman

在深度学习推理引擎MNN的使用过程中,经常需要将各种数据格式转换为框架能够识别的Tensor对象。本文将详细介绍如何将C++标准库中的std::vector容器数据转换为MNN框架中的Tensor对象。

背景介绍

MNN是阿里巴巴开源的一个轻量级高性能神经网络推理引擎,广泛应用于移动端和嵌入式设备的AI推理场景。在实际应用中,我们经常需要处理不同类型的输入数据,其中std::vector作为C++中最常用的动态数组容器,如何将其转换为MNN的Tensor是一个常见需求。

转换方法

假设我们有一个预训练的MNN模型,它需要两个输入:一个图像和一个向量。对于向量输入,我们可以按照以下步骤进行转换:

// 原始向量数据
std::vector<float> vec = {0.454f, 0.666f, 0.1212f};

// 创建MNN Tensor对象
MNN::Tensor* input_vector = MNN::Tensor::create(
    {static_cast<int>(vec.size())},  // Tensor形状,这里是一维向量
    halide_type_of<float>(),         // 数据类型,这里使用float32
    (void*)vec.data(),               // 数据指针
    MNN::Tensor::DimensionType::CAFFE // 维度类型
);

关键参数解析

  1. 形状参数{vec.size()}指定了Tensor的形状,对于一维向量,只需要指定其长度。

  2. 数据类型halide_type_of<float>()指定了Tensor中元素的数据类型为32位浮点数。如果模型使用其他数据类型,如int32或float16,需要相应调整。

  3. 数据指针:通过(void*)vec.data()将vector内部数据指针传递给Tensor,这种方式避免了数据拷贝,效率较高。

  4. 维度类型MNN::Tensor::DimensionType::CAFFE指定了Tensor的维度顺序,CAFFE格式表示NCHW(批次、通道、高度、宽度)的维度顺序。

注意事项

  1. 数据类型匹配:确保vector中的数据类型与模型期望的输入类型一致。如果模型期望的是float32,而vector是double,需要进行类型转换。

  2. 生命周期管理:使用这种方式创建的Tensor与原始vector共享内存,因此在Tensor使用期间,必须确保vector对象不被销毁或修改。

  3. 维度顺序:根据模型的具体要求,可能需要调整维度顺序。MNN支持多种维度类型,包括CAFFE、TENSORFLOW等。

  4. 多维度支持:对于多维数据,可以在形状参数中指定多个维度值,如{1, 3, 224, 224}表示一个批次为1的3通道224x224图像。

完整示例

以下是一个更完整的示例,展示了如何将vector转换为Tensor并用于模型推理:

// 加载模型
std::shared_ptr<MNN::Interpreter> interpreter(MNN::Interpreter::createFromFile("model.mnn"));

// 创建会话
MNN::ScheduleConfig config;
MNN::Session* session = interpreter->createSession(config);

// 获取输入Tensor
auto input_tensor = interpreter->getSessionInput(session, "vector_input");

// 准备输入数据
std::vector<float> input_data = {0.1f, 0.2f, 0.3f};

// 创建临时Tensor
MNN::Tensor temp_tensor(input_tensor, MNN::Tensor::DimensionType::CAFFE);
auto temp_data = temp_tensor.host<float>();
for (int i = 0; i < input_data.size(); ++i) {
    temp_data[i] = input_data[i];
}

// 拷贝到输入Tensor
input_tensor->copyFromHostTensor(&temp_tensor);

// 运行推理
interpreter->runSession(session);

// 处理输出...

总结

在MNN框架中使用std::vector作为模型输入时,可以通过直接创建Tensor对象并共享内存的方式实现高效转换。关键是要确保数据类型、形状和维度顺序与模型期望的输入相匹配。对于需要更高安全性的场景,也可以考虑先创建Tensor再拷贝数据的方式,虽然会有一定的性能开销,但能更好地控制数据生命周期。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
596
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K