MNN转换教程:PyTorch模型转MNN并实现量化训练

目录

将pytorch训练好的.pth模型转为.onnx模型

使用MNNConvert命令将.onnx模型转为.mnn模型(linux上进行)

第一种方法

第二种方法

报错解决

大概过程就是

训练量化

创建DataLoader

加载模型

将模型设置为训练量化模式

定义优化器

训练

测试

保存模型

量化精度


将pytorch训练好的.pth模型转为.onnx模型

import torch
import torch.onnx
import models

# 读取模型
model = models.crnn(inputdim=64, outputdim=1, pretrained_file= "trainedModels/bs1_epoch1_validloss_0.27896.pth")

# 将模型转为验证模式(这步好像不用也行)
model.eval()

# 随便创建一个临时数据,数据的大小要与网络输入一致。内容无所谓,因为后面只需要它的shape
temp_data = torch.randn(1,10,64)    # 1是batch_size

# 定义输入输出的名字,随便定,不过之后的操作好像会用到
input_names = ["input"]
output_names = ["output"]

# 转换模型
torch.onnx.export(model, temp_data, "trainedModels/onnx/test.onnx", verbose=True, training = True, input_names=input_names, output_names=output_names)

# blabla
print("ok")

使用MNNConvert命令将.onnx模型转为.mnn模型(linux上进行)

第一种方法

使用编译好的“MNNConvert”命令

./MNNConvert -f ONNX --modelFile test.onnx --MNNModel test.mnn --bizCode MNN

第二种方法

先安装python上的MNN库

python3 -m MNN.tools.mnnconvert

然后使用这个命令

python3 -m MNN.tools.mnnconvert -f ONNX --modelFile test.onnx --MNNModel test.mnn --bizCode MNN

报错解决

这里容易出现各种各样的错误,比如我原本的模型结构是这样的

转换模型的时候报了这个错误

最开始以为是mnn不支持LeakyReLU或者LPPooling,将二者都换掉以后还是不行,排查了很久最后发现是forward函数中的clamp导致的,果断把这个函数注释掉(对网络影响不大)。

然后重新训练、将模型转为onnx,报错变成了这个

这个报错就很明显了,意思是mnn不支持GRU,无奈只能把GRU换成LSTM。重新训练、将模型转为onnx,就没问题了。

随后我又尝试将LeakyReLU或者LPPooling换回来,发现LeakyReLU可以,但是LPPooling报了这个错

这个错误我没有仔细分析,猜测可能是mnn不支持LeakyReLU的意思。

最后经过若干次改动,模型结构变成了这样

大概过程就是

1、训练模型、将模型转为onnx。

2、有无报错。若有,转到第3步。若无,转到第5步。

3、结合报错和自己的猜测修改网络结构,将导致问题的算子直接替换掉(当然如果c的功底足够强的话也可以去改mnn的源代码)。

4、回到第1步。

5、成功。


训练量化

参考
这两个代码
,实际上过程跟pytorch训练模型差不多。

创建DataLoader

除了父类不同外,创建DataLoader的方法跟pytorch几乎一样,就是注意

__getitem__函数的返回值需要转为c++支持的expr格式

class XxxDataset(MNN.data.Dataset):
    def __init__(self, xxx):
        super(ImagenetDataset, self).__init__()
        pass

    def __getitem__(self, index):
        pass
        #最后需要把data和label转换为那个什么expr的格式
        #否则后面加载数据的时候会报错“Unable to cast Python instance to C++ type”
        data = F.const(data, data.shape, F.data_format.NCHW)
        label = F.const(label, label.shape, F.data_format.NCHW)
        return data, label

    def __len__(self):
        pass
train_dataset = ImagenetDataset(xxx)
test_dataset = ImagenetDataset(xxx)
train_dataloader = MNN.data.DataLoader(train_dataset, batch_size=1, num_workers=4, shuffle=True)
test_dataloader = MNN.data.DataLoader(test_dataset, batch_size=1, num_workers=4, shuffle=False)

加载模型

import MNN
nn = MNN.nn
F = MNN.expr

m = F.load_as_dict(model_file_path)

#这里的input_name、output_name跟前面将pth转为onnx时设置的input_name、output_name一样
inputs_outputs = F.get_inputs_and_outputs(m)
for key in inputs_outputs[0].keys():
    print('input names:\t', key)
for key in inputs_outputs[1].keys():
    print('output names:\t', key)
inputs = [m['input']]
outputs = [m['output']]

net = nn.load_module(inputs, outputs, for_training=True)

将模型设置为训练量化模式

#默认int8
nn.compress.train_quant(net, quant_bits=8)

定义优化器

opt = MNN.optim.SGD(net, 1e-5, 0.9, 0.00004)

训练

net.train(True)
train_dataloader.reset()

for i in range(train_dataloader.iter_number):
    data, label = train_dataloader.next()

    predict = net.forward(data)

    loss = nn.loss.cross_entropy(predict, label)

    opt.step(loss)

测试

net.train(False)
test_dataloader.reset()

for i in range(test_dataloader.iter_number):
    data, label= test_dataloader.next()

    predict = net(data) # 用 net.forwar() 应该也可以,没试过

    loss = nn.loss.cross_entropy(predict, label)

    predict = np.array(predict.read())
    label = np.array(label.read())
    correct = (np.sum(label == predict))

保存模型

predict = net.forward(F.placeholder([1, 10, 64], F.NCHW))
F.save([predict], file_name)

量化精度

浮点精度 > 训练量化精度 > 离线量化精度

训练量化的过程中精度会

逐渐降低

并介于浮点精度与离线量化精度之间。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个广泛使用的深度学习框架,而MNN是一个支持移动端的深度学习推理引擎。根据引用,MNN可以支持将PyTorch模型化为MNN格式,以实现在移动设备上进行人脸检测、目标检测等任务。 转换PyTorch模型MNN格式的过程可以分为几个步骤。首先,需要将PyTorch模型转换为ONNX模型。可以使用工具如onnx2ncnn.exe(引用)或MNNConvert.exe(引用)将ONNX模型转换MNN模型转换完成后,可以在移动设备上使用MNN引擎加载和运行这些模型。 总结来说,要将PyTorch模型化为MNN格式,可以按照以下步骤操作: 1. 将PyTorch模型转换为ONNX模型。 2. 使用onnx2ncnn.exe或MNNConvert.exe工具将ONNX模型转换MNN模型。 3. 在移动设备上使用MNN引擎加载和运行转换后的MNN模型。 这样就可以实现在移动设备上使用PyTorch模型进行推理任务了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MNN-APPLICATIONS-master.zip](https://download.csdn.net/download/AQSWDE123456789/12495277)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [39、Pytorch口罩模型成ncnn和mnn进行口罩检测](https://blog.csdn.net/sxj731533730/article/details/123273488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值