本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
MLP神经网络在用于数值预测时一般不设输出层激活函数,并以MSE作为损失函数
本文展示一个MLP神经网络用于数据预测的例子,并用pytorch进行实现与训练
通过本文可以具体了解如何使用MLP神经网络进行数值预测以及pytorch的代码实现
本节展示一个用MLP解决数值预测的例子,以及具体代码实现
MLP解决数值预测例子
本节展示如何使用MLP神经网络来解决数值预测问题,为方便理解,不妨采用以下的简单数据:
![]()
上述即为sin函数在[-5,5]之间的20个采样数据
由于样本较为简单,我们不妨将三层MLP神经网络设为4个隐节点
即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() # 显示画布
运行结果如下:
![]()
可以看到,模型根据训练数据,已经较好地拟合出sin函数曲线
将模型参数代回MLP神经网络的数学表达式,即可得到模型的数学表达式为:
好了,以上就是pytorch实现MLP神经网络-数值预测的例子了
End