老饼讲解-深度学习 机器学习 神经网络 深度学习
pytorch模型

【概述】pytorch是如何训练一个模型的

作者 : 老饼 发表日期 : 2024-03-16 05:26:28 更新日期 : 2024-04-02 02:44:39
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com







    01. pytorch训练模型-概述     




本节简单讲述在pytorch中是如何训练一个模型的




     pytorch是如何训练一个模型的     


pytorch面向的是深度学习中的模型,深度学习中的模型往往并非固定结构,而是灵活的"层前馈"结构
所以,pytorch的模型构建、训练往往与传统机器学习的不同,pytorch训练一个模型的流程大概如下:
 👉1. 模型的构建                                                                                                              
通过继承一个Module类来完成模型的构建,即模型被定义为一个Module类          
 👉2. 参数初始化                                                                                                             
对构建的模型Module类中所定义的模型参数进行初始化                                       
   👉3. 模型的训练                                                                                                                
                                          对训练样本进行逐批训练,每批样本都调用优化器来完成模型参数的更新,直到满足训练退出条件                   
总的来说,pytorch是提供了一个更加自由的形式来允许用户定义模型的结构
然后再提供相关的优化器来协助模型的训练,以此达到模型训练既可以个性化又不会太麻烦







     02. pytorch训练一个模型-示例     




本节展示如何使用pytorch来构建一个BP神经网络,并使用优化器进行训练




     pytorch训练一个三层BP神经网络      


三层BP神经网络是一种经典的神经网络,可用于拟合任意曲线
下面我们展示使用pytorch的模型训练流程来建立一个三层的BP神经网络,并用其拟合sin函数
具体代码示例如下:
import torch
from torch import nn
import matplotlib.pyplot as plt                                       
torch.manual_seed(99)                                                 
# ------训练数据----------------                                      
x = torch.linspace(-5,5,20).view(20,1)                                 # 在[-5,5]之间生成20个数作为x
y = torch.sin(x)                                                       # 模型的输出值y
                                                                      
# ------构建神经网络模型----------------                              
class BPModle(nn.Module):                                             
    def __init__(self):                                               
        super().__init__()                                            
        self.nn = nn.Sequential(                                      
            nn.Linear(1, 5),                                          
            nn.Tanh(),                                                
            nn.Linear(5, 1)                                           
        )                                                                                                                                   
    def forward(self, x):                                             
        y = self.nn(x)                                                
        return y                                                      
model = BPModle()                                                     
                                                                      
# ---------------模型训练--------------------                         
optimizer = torch.optim.SGD(model.parameters(), lr=0.1,momentum=0.9)   # 初始化优化器
for i in range(1000):                                                  
    optimizer.zero_grad()                                              # 将优化器里的参数梯度清空
    py   = model(x)                                                    # 模型的预测值                          
    loss = torch.nn.functional.mse_loss(py, y)                         # 均方差损失函数
    loss.backward()                                                    # 更新参数的梯度
    print(loss)                                                        # 打印当前损失函数值
    optimizer.step()                                                   # 更新参数
py = model(x)                                                          # 模型预测结果               
                                                                      
#-----------打印结果--------------------                              
# 打印训练误差                                                        
print('\n-------------打印结果---------------------')                 
print('最终训练误差mse:',torch.mean((py-y)**2).data)                   # 打印训练误差(均方差)
                                                                      
# 打印模型参数                                                        
print('各个参数如下:')                                                
param_dict = model.state_dict()                                        # 提取模型参数
for key in param_dict:                                                 # 逐个打印参数
    print(key,':',param_dict[key])                                     # 打印当前参数
                                                                      
# 绘制拟合曲线                                                        
t  = torch.linspace(-5,5,100).view(100,1)                              # 用于绘制拟合曲线的x
pt = model(t)                                                          # 用于绘制拟合曲线的y
plt.scatter(x, y,  c='red',  marker='o',label='train data')            # 画出训练数据点
plt.plot(t.detach().numpy(), pt.detach().numpy(),label='test data')    # 画出拟合曲线
plt.legend()                                                           # 显示图例 

运行结果如下:
模型的训练误差与模型参数如下:
 
  
模型对训练样本数据的拟合结果如下
 

 可以看到,训练的模型已经较好的拟合训练样本数据点










 End 








联系老饼