【神经网络】保存提取模型权重,C++进行计算推理

pytorch获取全部权重参数、每一层权重参数

自制深度学习推理框架-第七课-构建自己的计算图

一、提取pytorch模型权重

首先查看模型权重的各个层的大小分布情况:

E:\Anaconda3\envs\pytorch1_12\python.exe G:/project/PythonProject/FCRegression/get_parameter.py
l1.weight ; torch.Size([32, 24])
l1.bias ; torch.Size([32])
l3.weight ; torch.Size([32])
l3.bias ; torch.Size([32])
l4.weight ; torch.Size([64, 32])
l4.bias ; torch.Size([64])
l6.weight ; torch.Size([64])
l6.bias ; torch.Size([64])
l7.weight ; torch.Size([128, 64])
l7.bias ; torch.Size([128])
l9.weight ; torch.Size([128])
l9.bias ; torch.Size([128])
l10.weight ; torch.Size([64, 128])
l10.bias ; torch.Size([64])
l12.weight ; torch.Size([64])
l12.bias ; torch.Size([64])
l13.weight ; torch.Size([32, 64])
l13.bias ; torch.Size([32])
l15.weight ; torch.Size([32])
l15.bias ; torch.Size([32])
l16.weight ; torch.Size([1, 32])
l16.bias ; torch.Size([1])


Process finished with exit code 0

二、在C++中读取数据

libnpy : 如何在C++中载入numpy ndarray
https://github.com/llohse/libnpy
cnpy: 如何使用c++读写npy文件
cnpy 库使用笔记
https://github.com/rogersce/cnpy

加载时间对比:

使用libnpy加载:
把npy.hpp放在include里,编译:

g++ main.cpp -I/usr/include/eigen3 -I/home/whf/projects/eigen_test/include

测试结果the load time is : 6.5e-05s.

用cnpy加载:

g++ main.cpp -I/usr/include/eigen3 -L/usr/local/lib -lcnpy -lz

测试结果the load time is : 0.000507s.

可以看出,libnpy比cnpy快了大约一个数量级。

三、C++矩阵处理:

利用Eigen库快速入门矩阵运算——开源库Eigen

Eigen入门系列 —— Eigen::Matrix数据的读写、访问、替换

C++学习笔记(14) Eigen库与数组互传

C++ Eigen库矩阵操作

还可以进一步利用MKL进行加速优化:【高性能计算】Cpp + Eigen + Intel MKL + 函数写成传引用

C++中使用YOLOv5(You Only Look Once v5)神经网络模型结合NCNN(Neural Computation Network Library)进行推理时,提取输出数据的步骤可能会涉及以下几个关键点: 1. **加载模型**:首先,你需要用NCNN的API将预训练的YOLOv5模型文件加载到内存中。这通常涉及到创建`ncnn::Model`对象,并指定模型权重路径。 ```cpp ncnn::Model model; if (!model.load(model_file.c_str())) { // 处理加载失败的情况 } ``` 2. **设置输入**:你需要准备一张图片作为输入数据,然后将其转化为NCNN所接受的格式,例如`ncnn::Mat`对象。 3. **推理**:调用`model.infer()`函数,传入输入数据,模型会执行前向计算并生成输出。 ```cpp ncnn::Mat input; // ... 加载并填充图像到input model.predict(input); ``` 4. **获取输出**:YOLOv5的输出通常是一个包含检测框、类别和置信度的结构。在NCNN中,这可能需要解析`ncnn::Mat`中的多个层。YOLOv5的输出包括Anchor Boxes(候选边界框)、Class IDs、Confidences等信息,可能存储在一个二维数组或其他类似的数据结构里。 ```cpp ncnn::Mat detections = model.getOutput(0); // 假设输出层的索引为0 ``` 5. **解码和后处理**:最后,你需要对这些原始的输出进行解码和后处理,例如非极大抑制(Non-Maximum Suppression,NMS),得到最终的物体检测结果。 ```cpp std::vector<std::tuple<Rect, int, float>> results = decodeAndNMS(detections); ``` 这里的`Rect`代表一个四元组表示矩形的位置(x, y, width, height),`int`是类别ID,`float`是置信度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dataloading...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值