Pytorch教程

【示例】pytorch模型-带模块的模型

作者 : 老饼 发表日期 : 2024-03-10 04:35:26 更新日期 : 2024-03-24 15:22:54
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



用pytorch构建一个简单的模型,往往并不突出pytorch模型的强大,

pytorch构建模型的强大在于构建一个复杂的模型,这就涉及到模型的分模块构建

本文讲解如何使用pytorch构建一个带模块的模型,以及如何使用pytorch自带的模块




     01. pytorch带模块的模型      




本节展示pytorch中如何定义一个模块并在模型中使用




      pytorch带模块的模型-示例    


下面仍然是使用pytorch实现一个三层的BP神经网络,在本例中我们在模型中引入了子模块的概念
具体示例如下:
import torch
from   torch import nn
# -----------定义模型-----------
# 定义线性层模块
class Liner(nn.Module):
    def __init__(self,in_num,out_num):
        super(Liner, self).__init__()
        self.w =  nn.Parameter(torch.randn(in_num,out_num))   # 定义模块参数w1
        self.b =  nn.Parameter(torch.randn(1,out_num))        # 定义模块参数b1
    def forward(self, x):
        y = x@self.w+self.b
        return y                                              
# 定义模型                                                    
class Model(nn.Module):                                       
    def __init__(self):                                       
        super(Model, self).__init__()                         
        self.L1 = Liner(2,3)                                  # 定义第一个线性层
        self.L2 = Liner(3,2)                                  # 定义第二个线性层
    def forward(self, x):                                     
        # 定义模型的计算                                      
        y1 = nn.functional.tanh(self.L1(x))                   
        y = self.L2(y1)                                       
        return y                                              
                                                              
# ------训练数据---------------                               
X = torch.tensor([[2.5, 1.3, 6.2, 1.3, 5.4, 6 ,4.3, 8.2]      
                ,[-1.2,2.5,3.6,4,3.4,2.3,7.2,3.9]]).T         # 输入数据
y = torch.tensor([0,0,1,0,1,1,1,1])                           # 样本的标签
                                                              
# -----模型训练----------------                               
model     = Model()                                           # 初始化模型
lossFun   = torch.nn.CrossEntropyLoss()                       # 损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)       # 初始化优化器
for i in range(500):                                          
    py = model(X)                                             # 计算模型的输出值
    L = lossFun(py, y)                                        # 计算模型损失值
    print('第',str(i),'轮的Loss:',L)                         # 打印当前损失函数值
    optimizer.zero_grad()                                     # 更新梯度之前先清空梯度
    L.backward()                                              # 用损失函数更新模型系数的梯度
    optimizer.step()                                          

# -------打印模型参数-------------------                      
param_dict = model.state_dict()                               # 从模型中提取出模型参数
for key in param_dict:                                        # 历遍所有参数名称
   print(key,':',param_dict[key].data)                        # 打印参数名称和数据
运行结果如下:
 





       pytorch带模块的模型-代码解说      


从上述代码可以看到,我们在模型中把线性层作为一个独立模块,
因为模型的线性层是通用的,独立将它定义为一个模块,这样在模型中就可以重复调用
 为什么不能定义为一个函数,而一定要定义为一个模块?
因为线性层里是带参数的,我们必须告诉模型哪些是参数,所以要通过模块的形式来定义
在上述代码中,我们将线性层定义为名为Liner的模块,并在model中调用
而model模块会自动把引用到的Liner模块的参数收集起来,这是Module类的特性
可以看到,打印出来的参数会显示为L1.w的形式,也就是以"子模块名称+参数名称"的形式来命名








    02. pytorch提供的模块    




本节展示如何使用pytorch提供的模块来构建模型




      pytorch提供的模块      


pytorch已经提供了许多基础模块,所以在实际使用中,更多时候直接调用就可以了
pytorch提供的模块最常用的可以分为三类:
1. 常用的深度学习层模块:例如卷积层、池化层、全连接(线性)层、BN层等等
2. 激活函数模块:例如ReLu、LeakyReLU、tanh等等                                    
3. 其它:例如Flatten等等                                                                             
往往我们只需要先在Init初始化这些模块,然后在forward中进行调用就可以了






      使用pytorch提供的线性层实现一个三层BP神经网络      


下面使用pytorch提供的线性层实现一个三层BP神经网络
 具体示例代码如下:
from   torch import nn
# -----------定义模型-----------
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.L1 = nn.Linear(2,3)          # 定义第一个线性层
        self.L2 = nn.Linear(3,2)          # 定义第二个线性层
    def forward(self, x):
        # 定义模型的计算
        y1 = nn.functional.tanh(self.L1(x)) 
        y = self.L2(y1)
        return y

# -------打印模型参数-------------------
model     = Model()                                        # 初始化模型
param_dict = model.state_dict()                            # 从模型中提取出模型参数
for key in param_dict:                                     # 历遍所有参数名称
   print(key,':',param_dict[key].data)                     # 打印参数名称和数据
运行结果如下:
 
 
 可以看到,只需要在模型中引用pytorch提供的Linear模块,模型中自然就会有Linear模块的权重、阈值等参数











 End 








联系老饼