本文已参与「新人创作礼」活动,一起开启掘金创作之路。
写在前面: 我在前面的文章提到了反向传播算法,但是都是一些基本的理论,没有用实际的例子去演示,今天我用一个简单的例子去演示反向传播算法的代码格式,如果有写的不好,大家不要介意,我也是在学习当中。
\
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
复制代码
结果分析
从上面的实验数据我们可以得到,步长也就是学习频率和学习次数都是都最后的拟合有很大的影响的。