深度学习-一篇入门

【代码】一个实例之-实现一个MLP神经网络用于数值预测

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


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

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

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





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




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





    MLP解决数值预测例子-数据说明    


本节展示如何使用MLP神经网络来解决数值预测问题,为方便理解,不妨采用以下的简单数据:
 MLP神经网络来解决数值预测问题-数据 
上述即为sin函数在[-5,5]之间的20个采样数据






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


由于样本较为简单,我们不妨将三层MLP神经网络设为4个隐节点
 即MLP神经网络模型结构如下:
 MLP神经网络模型结构 
设置好以上的模型之后,将均方差作为损失函数,使用梯度下降法对其进行训练即可
在pytorch中可以使用深度学习的相关框架来实现MLP神经网络
在这里我们为了更具体了解MLP神经网络,不使用框架,仅利用pytorch的自动求导功能
 
以《三层MLP神经网络是如何训练的》一文中的算法流程为例,用pytorch实现一个MLP神经网络
 具体代码如下:
import torch
import matplotlib.pyplot as plt 
torch.manual_seed(99)

# -----------计算网络输出:前馈式计算---------------
def forward(w1,b1,w2,b2,x):                                   
    return w2@torch.tanh(w1@x+b1)+b2

# -----------计算损失函数: 使用均方差--------------
def loss(y,py):
    return ((y-py)**2).mean()

# ------训练数据----------------
x = torch.linspace(-5,5,20).reshape(1,20)                      # 在[-5,5]之间生成20个数作为x
y = torch.sin(x)                                               # 模型的输出值y

#-----------训练模型------------------------
in_num  = x.shape[0]                                            # 输入个数
out_num = y.shape[0]                                            # 输出个数
hn  = 4                                                         # 隐节点个数
w1  = torch.randn([hn,in_num],requires_grad=True)               # 初始化输入层到隐层的权重w1
b1  = torch.randn([hn,1],requires_grad=True)                    # 初始化隐层的阈值b1
w2  = torch.randn([out_num,hn],requires_grad=True)              # 初始化隐层到输出层的权重w2
b2  = torch.randn([out_num,1],requires_grad=True)               # 初始化输出层的阈值b2

lr = 0.01                                                       # 学习率
for i in range(5000):                                           # 训练5000步
    py = forward(w1,b1,w2,b2,x)                                 # 计算网络的输出
    L = loss(y,py)                                              # 计算损失函数
    print('第',str(i),'轮:',L)                                 # 打印当前损失函数值
    L.backward()                                                # 用损失函数更新模型参数的梯度
    w1.data=w1.data-w1.grad*lr                                  # 更新模型系数w1
    b1.data=b1.data-b1.grad*lr                                  # 更新模型系数b1
    w2.data=w2.data-w2.grad*lr                                  # 更新模型系数w2
    b2.data=b2.data-b2.grad*lr                                  # 更新模型系数b2
    w1.grad.zero_()                                             # 清空w1梯度,以便下次backward
    b1.grad.zero_()                                             # 清空b1梯度,以便下次backward
    w2.grad.zero_()                                             # 清空w2梯度,以便下次backward
    b2.grad.zero_()                                             # 清空b2梯度,以便下次backward
px = torch.linspace(-5,5,100).reshape(1,100)                    # 测试数据,用于绘制网络的拟合曲线    
py = forward(w1,b1,w2,b2,px).detach().numpy()                   # 网络的预测值
plt.scatter(x, y)                                               # 绘制样本
plt.plot(px[0,:],py[0,:])                                       # 绘制拟合曲线  
print('w1:',w1)
print('b1:',b1)
print('w2:',w2)
print('b2:',b2)
运行结果如下:
.....                                            
第 4996 轮: tensor(0.0083, grad_fn=<MeanBackward0>)
第 4997 轮: tensor(0.0083, grad_fn=<MeanBackward0>)
第 4998 轮: tensor(0.0083, grad_fn=<MeanBackward0>)
第 4999 轮: tensor(0.0083, grad_fn=<MeanBackward0>)
                     w1: tensor([[ 0.1742],[-0.8133],[-0.6450],[-0.4054]],requires_grad=True)
                   b1: tensor([[ 0.8125],[0.0593],[-1.8776],[1.1220]],requires_grad=True)
             w2: tensor([[-0.7753,-2.0142,1.1161,1.9635]],requires_grad=True)
b2: tensor([[0.1094]], requires_grad=True)         
 
MLP用于数值预测的效果 
可以看到,模型根据训练数据,已经较好地拟合出sin函数曲线
 将模型参数代回MLP神经网络的数学表达式,即可得到模型的数学表达式为:
 






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










 End 





联系老饼