简单理解反向传播

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

写在前面: 我在前面的文章提到了反向传播算法,但是都是一些基本的理论,没有用实际的例子去演示,今天我用一个简单的例子去演示反向传播算法的代码格式,如果有写的不好,大家不要介意,我也是在学习当中。

\

1、反向传播算法

反向传播算法适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。反向传播算法网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。

2、数据准备

# 1、我们选取这个这个目标函数来模拟,也就是说这个是真实的数据线性方程y = 3x + 0.8# 2、学习率我们选择 0.05,也就是步长learnning_rate = 0.05# 3、使用均方误差MSE
复制代码

3、源码

我在这里先贴上源码,大家根据源码来分析

 import torch   
 import matplotlib.pyplot as plt    
 import numpy as np    
 # 学习率   
 learnning_rate = 0.05    
 # 准备数据,可以理解为准确的数据    
 # y = 3x + 0.8   
 # 随机生成 500 行一列的数据   
 x = torch.rand([500, 1])    
 # 这里的y是真实值,   
 y_true = x*3 + 0.8    
 # 随机生成一行一列的数据,模拟系数   
 w = torch.rand([1, 1], requires_grad=True)    
 # 生成一个0 模拟b    b = torch.tensor(0,requires_grad=True,dtype=torch.float32)    for i in range(500):        
 # 生成预测的值      
 y_predict = torch.matmul(x, w) + b       
 # 计算loss 也就会损失值 均方误差 MSE        
 loss = (y_true - y_predict).pow(2).mean()        
 if w.grad is not None:            
     w.grad.data.zero_()        
         if b.data.grad is not None:            
             w.grad.data.zero_()        
             loss.backward()       
             w.data = w.data - learnning_rate*w.grad        
             b.data = b.data - learnning_rate*b.grad       
             if i%10 == 10:            
                 print("w:, b:, loss:",w.item(),b.item(),loss.item())    
 plt.figure(figsize=(20,8))    
 plt.scatter(x.numpy(),y_true.numpy().reshape(-1))    
 y_predict = torch.matmul(x,w)+b    
 # detach() 从当前图形中脱离    
 # reshape(-1) 将多维的数据扁平化    
 plt.plot(x.numpy().reshape(-1), 
 y_predict.detach().numpy().reshape(-1))    
 plt.show()
复制代码

4、结果展示

复制代码

# 学习率learnning_rate = 0.2# 训练次数50
复制代码

# 学习率learnning_rate = 0.2# 训练次数100
复制代码

# 学习率learnning_rate = 0.05# 训练次数100
复制代码

结果分析

从上面的实验数据我们可以得到,步长也就是学习频率和学习次数都是都最后的拟合有很大的影响的。

猜你喜欢

转载自juejin.im/post/7130623610753908766