构造BP网络使用反向传播拟合线性、非线性模型

1,拟合y = w*x (训练集的w=2,结果越接近2拟合效果越好)

代码如下:

# y = wx模型

import torch
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w_data = []
epoch_data = []
epoch = 1

# 创建Tensor节点
w = torch.Tensor([66.0])
# 设置计算梯度
w.requires_grad = True

for epoch in range(100):
    
    # 每次都能拿到一个梯度,直接全部都用
    for x, y in zip(x_data, y_data):
        # 构建图
        l = (w * x - y) ** 2
        # 反馈,更新grad(梯度)值
        l.backward()
        # 根据梯度下降法公式更新权重
        w.data = w.data - 0.01 * w.grad.data
        print("epoch:",epoch)
        print("梯度w.grad.item",w.grad.item())
        print("W:",w.data)
        w_data.append(w.data.item())#这里也可以w_data.append(w.data),plt也能识别出来Tensor里面的数值
        epoch_data.append(epoch)
        epoch += 1
        w.grad.data.zero_()

print(epoch_data)
print(w_data)

plt.plot(epoch_data,w_data)
plt.xlabel("Epoch")
plt.ylabel("W")
plt.show()

拟合结果:

alt

2,拟合y = w1x^2 + w2x + b(训练集:w1 = 2, w2 = 3, b= 4)

代码如下:


# y = w1x^2 + w2x + b
# 正确值:w1 = 2, w2 = 3, b = 4

import torch
import matplotlib.pyplot as plt

x_data = [0.0, 1.0, 2.0, 3.0]
y_data = [4.0, 9.0, 18.0, 31.0]

w1_data = []
w2_data = []
b_data = []

epoch_data = []
epoch = 1

# 创建Tensor节点 
w1 = torch.Tensor([10.0])
w2 = torch.Tensor([10.0])
b = torch.Tensor([10.0])
# 设置计算梯度
w1.requires_grad = True
w2.requires_grad = True
b.requires_grad = True

for epoch in range(500):
    
    # 每次都能拿到一个梯度,直接全部都用
    for x, y in zip(x_data, y_data):
        # 构建图
        l = ((w1 * (x ** 2) + w2 * x + b) - y) ** 2 # 其实就是利用反向传播来求这个式子在各个权重方向的偏导
        # 反馈,更新grad(梯度)值
        l.backward()
        # 根据梯度下降法公式更新权重
        w1.data = w1.data - 0.01 * w1.grad.data
        w2.data = w2.data - 0.01 * w2.grad.data
        b.data = b.data - 0.01 * b.grad.data

        print("epoch:",epoch)
        print("W1:",w1.data)
        print("W2:",w2.data)
        print("b:",b.data)
        w1_data.append(w1.data.item())#这里也可以w_data.append(w.data),plt也能识别出来Tensor里面的数值
        w2_data.append(w2.data.item())
        b_data.append(b.data.item())
        epoch_data.append(epoch)
        epoch += 1
        w1.grad.data.zero_()
        w2.grad.data.zero_()
        b.grad.data.zero_()


plt.plot(epoch_data,w1_data, "g", label="W1")
plt.plot(epoch_data,w2_data, "r", label="W2")
plt.plot(epoch_data,b_data, label="b")

plt.xlabel("Epoch")
plt.show()


拟合结果:

alt

全部评论
requires_grad 和 requires_grad_ 有什么区别呀大佬
点赞 回复 分享
发布于 2023-07-17 10:36 河南

相关推荐

10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务