pytorch训练出来的模型参数如何保存为嵌入式C语言能够调用的形式

在深度学习算法嵌入式开发应用中,如何把在pytorch下训练得到的模型参数,提取出来保存成C语言能够调用的数组形式,是嵌入式应用开发的重要步骤。

以下介绍一个简单的例子,下文中的代码来自莫凡教程,是一个线性回归的简单深度学习例子,输入节点为1个,隐藏层10个节点,输出一个节点。relu用的是普通的,所以不需要参数。

 

从模型中索引到参数通过如下方法调用named_parameters(),parameters.detach().numpy()

for name,parameters in net3.named_parameters():
    print(name,':',parameters.size())
    parm[name] = parameters.detach().numpy()

 

保存成文件如下操作:

f = open('./w1.txt',mode = 'w+') #是创建一个txt文件。参数 'w+'的意思是如果存在该文件,则删除内容,从头开始书写,如果不存在该文件,则创建一个。

f.write('const float w1[%d] = {\n'% w1.shape[0]*w1.shape[1]) #这一句的意思是定义一个float 类型的数组名字为w1的常量,数组的维度 = w1.shape[0]*w1.shape[1]。

for j in range(w1.shape[0]):#遍历每一行(=10)
    for i in range(w1.shape[1]):#遍历每一列(=1)
        f.write(str(w1[j,i])+',\n')#由于这种形式可以操控任何一个参数,所以你可以想保存成怎样就怎样。str()可以直接把numpy类型的数转成str。因为f.write()支持的是str类型。当然还需要加点                                             #逗号、回车之类以写成c语言认识的形式
        pass
    pass

 

最终输出是这样的文件

w1.txt

const float w1[10] = {
-1.016925,
-0.3459752,
0.5006739,
-0.60270876,
0.4570868,
0.025785923,
0.154984,
0.3099202,
0.6377684,
-0.55719304,
}

 

代码:

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
import time

x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)  # x data (tensor), shape=(100, 1)
y = x.pow(2) + 0.2*torch.rand(x.size())                 # noisy y data (tensor), shape=(100, 1)

class Net(nn.Module):
    def __init__(self,n_feature,n_hidden,n_output):
        super(Net,self).__init__()
        self.hidden = nn.Linear(n_feature,n_hidden)
        self.predict = nn.Linear(n_hidden,n_output)
        
    def forward(self,x):
        x = F.relu(self.hidden(x))
        x = self.predict(x)
        
        return x

net1 = Net(1,10,1)
optimizer = torch.optim.SGD(net1.parameters(),lr=0.1)
loss_func = nn.MSELoss()


for i in range(100):
    prediction = net1(x)
    loss = loss_func(prediction,y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    

torch.save(net1,'net.pkl')
torch.save(net1.state_dict(),'net_parms.pkl')


net2 = torch.load('net.pkl')
net3 = Net(1,10,1)
net3.load_state_dict(torch.load('net_parms.pkl'))

parm = {}
for name,parameters in net3.named_parameters():
    print(name,':',parameters.size())
    parm[name] = parameters.detach().numpy()

w1 = parm['hidden.weight']
b1 = parm['hidden.bias']
w2 = parm['predict.weight']
b2 = parm['predict.bias']
print(w1)
print(b1)
print(w2)
print(b2)
# print('size:',w1.shape[0])
f = open('./w1.txt',mode = 'w+')
f.write('const float w1[%d] = {\n'% w1.shape[0]*w1.shape[1])
t = str(w1[1,0])
print(t)
for j in range(w1.shape[0]):
    for i in range(w1.shape[1]):
        f.write(str(w1[j,i])+',\n')
        pass
    pass
f.write('}\n')
f.close()
# plt.figure(1, figsize=(10, 3))
# plt.subplot(131)
# plt.title('net1')
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
#
# plt.subplot(132)
# plt.title('net2')
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.plot(x.data.numpy(), net2(x).data.numpy(), 'r-', lw=5)
#
# plt.subplot(133)
# plt.title('net3')
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.plot(x.data.numpy(), net3(x).data.numpy(), 'r-', lw=5)
# plt.show()



 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch训练好的模型可以通过以下步骤进行保存和使用: 1. 保存模型:使用torch.save()函数将模型保存到文件中,例如: ``` torch.save(model.state_dict(), 'model.pth') ``` 其中,model是训练好的模型,state_dict()函数返回模型参数字典,'model.pth'是保存的文件名。 2. 加载模型:使用torch.load()函数加载保存模型文件,例如: ``` model.load_state_dict(torch.load('model.pth')) ``` 其中,model是定义好的模型,'model.pth'是保存的文件名。 3. 使用模型:加载模型后,可以使用模型进行预测或者继续训练,例如: ``` output = model(input) ``` 其中,input是输入数据,output是模型的输出结果。 需要注意的是,保存和加载模型时需要保证模型的结构和参数一致,否则会出现错误。另外,保存模型文件可以在不同的设备上使用,例如在CPU和GPU上进行预测。 ### 回答2: PyTorch是一种深度学习框架,可以用来开发和训练各种人工智能模型,包括卷积神经网络(CNNs)、循环神经网络(RNNs)和变压器神经网络(Transformers)。当你在PyTorch训练好了一个模型之后,你可能想把它保存下来,以便以后使用。 PyTorch中有多种方可以保存模型,以下是其中几种: 1. 保存整个模型 如果你想保存整个模型,包括它的参数、权重、结构和优化器,可以使用以下代码: ```python torch.save(model, PATH) ``` 该代码将整个模型保存到名为PATH的文件中。 2. 保存模型参数 如果你只想保存模型参数和权重,可以使用以下代码: ```python torch.save(model.state_dict(), PATH) ``` 该代码将模型的状态字典保存到名为PATH的文件中。 3. 加载保存模型 如果你想加载保存模型,以便在以后使用,可以使用以下代码: ```python model = torch.load(PATH) ``` 该代码将模型从名为PATH的文件中加载出来。 4. 加载模型参数 如果你只是想加载模型参数和权重,可以使用以下代码: ```python model.load_state_dict(torch.load(PATH)) ``` 该代码将模型的状态字典从名为PATH的文件中加载出来。 5. 使用保存模型进行预测 一旦你加载了保存模型,就可以使用它来做出预测。以下是一个基本的使用模型进行预测的示例代码: ```python outputs = model(inputs) ``` 该代码将模型应用于输入,并返回输出。你可以使用这些输出来生成预测。 ### 回答3: PyTorch是一个开源深度学习框架,它具有简单易用、灵活、高效等特点。在使用PyTorch进行深度学习任务时,我们通常需要保存训练好的模型,以供后续使用。下面是关于PyTorch训练好的模型保存和使用的详细说明: 1. 保存模型 我们可以使用torch.save()函数来保存模型。该函数接受两个参数:要保存模型和要保存的文件名。例如,我们要将训练好的模型保存为“model.pt”,可以使用以下代码: torch.save(model, 'model.pt') 此时,模型将被保存到当前目录下的“model.pt”文件中。我们也可以指定保存的文件路径,例如: torch.save(model, './saved_models/model.pt') 这样,模型将被保存到当前目录下的“saved_models”目录中,在该目录下创建名为“model.pt”的文件。 2. 加载模型 使用torch.load()函数可以加载已保存模型。该函数接受一个参数:要加载的文件名或路径。例如,我们要加载名为“model.pt”的模型,可以使用以下代码: model = torch.load('model.pt') 此时,已保存模型将会被加载到变量“model”中。需要注意的是,我们必须先定义一个与保存模型时相同的模型结构,才能正确地加载模型。 3. 使用模型 经过保存和加载之后,我们就可以使用训练好的模型来进行应用。以分类任务为例,我们可以使用以下代码对一张图片进行分类: import torch.nn.functional as F import torchvision.transforms as transforms from PIL import Image # 加载模型 model = torch.load('model.pt') # 读取图片并进行预处理 img = Image.open('test.jpg') transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) img_tensor = transform(img) img_tensor = img_tensor.unsqueeze(0) # 使用模型进行推理 with torch.no_grad(): outputs = model(img_tensor) _, predicted = torch.max(outputs.data, 1) print(predicted.item()) 在上述代码中,我们先使用torch.load()函数加载模型,然后读取一张图片,并通过transforms.Compose()函数对其进行预处理。最后,我们使用模型对处理后的图片进行推理,并输出分类结果。 总之,PyTorch提供了简单易用的模型保存和加载方法,使我们能够轻松地训练保存和使用深度学习模型

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值