MLP-入门教程

【例子】MLP神经网络例子-数值预测

作者 : 老饼 发表日期 : 2023-05-08 11:41:37 更新日期 : 2025-04-24 18:33:26
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com


MLP神经网络在用于数值预测时一般不设输出层激活函数,并以MSE作为损失函数

本文展示一个MLP神经网络用于数据预测的例子,并用pytorch进行实现与训练

通过本文可以具体了解如何使用MLP神经网络进行数值预测以及pytorch的代码实现





   01. MLP神经网络数值预测-例子   




本节展示一个用MLP解决数值预测的例子,以及具体代码实现





    MLP解决数值预测例子     


本节展示如何使用MLP神经网络来解决数值预测问题,为方便理解,不妨采用以下的简单数据:
 MLP神经网络来解决数值预测问题-数据 
上述即为sin函数在[-5,5]之间的20个采样数据
由于样本较为简单,我们不妨将三层MLP神经网络设为4个隐节点
 即MLP神经网络模型结构如下:
 MLP神经网络模型结构 
设置好以上的模型之后,使用均方差作为损失函数,使用SGD对其进行训练即可






    MLP解决数值预测例子-代码实现    


下面使用pytorch的框架来实现上述的MLP神经网络,并使用SGD算法对它进行训练
备注:在这里,我们不进行分批,仅使用带权重衰减的动量梯度算法进行训练
 具体代码如下:
import torch
from   torch import nn
import matplotlib.pyplot  as plt 
torch.manual_seed(99)     # 设定随机种子,使得每次运行结果一样

# 定义神经网络的结构
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.stack=nn.Sequential(
            nn.Linear(1, 4),                                                       # 1输入,4输出
            nn.Tanh(),                                                             # 激活函数用Tanh
            nn.Linear(4, 1)                                                        # 4输入,1输出
            )                                                                      
    def forward(self, x):                                                          
        y = self.stack(x)                                                          # 按stack计算模型输出
        return y                                                                   # 输出y
    
# ------训练数据----------------
x = torch.linspace(-5,5,20).reshape(20,1)                                          # 在[-5,5]之间生成20个数作为x
y = torch.sin(x)                                                                   # 模型的输出值y

# ------模型训练----------------
model     = MLP()                                                                  # 初始化模型
lossFun   = torch.nn.MSELoss()                                                     # 定义损失函数为MSE
optimizer = torch.optim.SGD(model.parameters(), lr=0.01,momentum =0.9)             # 初始化优化器
for epoch in range(10000):                                                         # 训练10000步
    optimizer.zero_grad()                                                          # 将优化器里的参数梯度清空
    py   = model(x)                                                                # 计算模型的预测值   
    loss = lossFun(py, y)                                                          # 计算损失函数值
    loss.backward()                                                                # 更新参数的梯度
    optimizer.step()                                                               # 更新参数
    # ----计算错误率----                                                           
    print('第',epoch,'步,MSE:' ,loss.item())                                       # 打印MSE
    if(loss<=0.001):                                                               # 检查退出条件
        break   	
		
# -------打印模型训练结果----------                                                
print('\n----模型训练结果---')                                                     # 打印标题    
print('MSE:' ,loss.item())                                                         # 打印MSE   

print('\n----模型参数---')                                                         # 打印标题   
param_dict = dict(model.named_parameters())                                        # 提取模型参数
for key in param_dict:                                                             # 逐层打印参数
    print(key,":",param_dict[key].data)                                            # 打印当前层的参数
	
# 绘制预测结果                                                                    
px = torch.linspace(-5,5,100).reshape(100,1)                                       # 测试数据,用于绘制网络的拟合曲线    
py = model(px).detach().numpy()                                                    # 网络的预测值
plt.scatter(x, y)                                                                  # 绘制样本
plt.plot(px[:,0],py[:,0])                                                          # 绘制拟合曲线 
plt.show()                                                                         # 显示画布
运行结果如下:
 
代码运行结果
 
MLP的拟合效果 
可以看到,模型根据训练数据,已经较好地拟合出sin函数曲线
 将模型参数代回MLP神经网络的数学表达式,即可得到模型的数学表达式为:
 






好了,以上就是pytorch实现MLP神经网络-数值预测的例子了










 End 





内容纠正