泛览天下

阅读,看尽天下事

反向传播算法实战

2021-10-12 10:27:23


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


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


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
反向传播算法实战

结果分析

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