B站刘二大人-反向传播Lecture4


系列文章:
《PyTorch深度学习实践》完结合集-B站刘二大人

Pytorch代码注意的细节,容易敲错的地方

B站刘二大人-线性回归及梯度下降 Lecture3

B站刘二大人-反向传播Lecture4

B站刘二大人-线性回归 Pytorch实现 Lecture 5

B站刘二大人-多元逻辑回归 Lecture 7

B站刘二大人-数据集及数据加载 Lecture 8

B站刘二大人-Softmx分类器及MNIST实现-Lecture 9


文章目录

    • 代码


代码

import matplotlib.pyplot as plt
import  torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# w是张量且设置了梯度跟踪
w = torch.Tensor([1.0])
w.requires_grad = True
print("w=",w)
def forward(x):
    return x*w
# 单个数据的损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y)*(y_pred-y)
# 学习率
alpha = 0.001
epoch_list = []
w_list = []
loss_list = []
for epoch in range(100):
    l = 0
    loss_sum = 0
    for (x ,y) in zip(x_data, y_data):
        # l, loss_sum都是张量,无梯度跟踪
        l = loss(x,y)
        loss_sum += l.data
        # 我的疑问:反向传播、梯度更新进行了epoch*len(x_data),
        # 为什么不能进行epoch次。
        l.backward()
        w.data = w.data - alpha*w.grad.data
        w.grad.data.zero_()
    w_list.append(w.data)
    epoch_list.append(epoch)
    # 获取张量上的值需要转换为numpy
    loss_list.append(loss_sum.data.numpy()[0])
plt.plot(epoch_list, loss_list)
plt.xlabel("epoch")
plt.ylabel("loss_sum")
plt.show()

B站刘二大人-反向传播Lecture4_第1张图片

反向传播、梯度更新进行lepoch次的代码

import matplotlib.pyplot as plt
import  torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# w是张量且设置了梯度跟踪
w = torch.Tensor([1.0])
w.requires_grad = True
print("w=",w)
def forward(x):
    return x*w
# 单个数据的损失函数
def loss(xs, ys):
    # y_pred = forward(x)
    # return (y_pred - y)*(y_pred-y)
    loss_sum = 0
    for(x, y) in zip(xs, ys):
        y_pred = forward(x)
        loss_sum += (y_pred-y)*(y_pred-y)
    return  loss_sum/len(xs)
# 学习率
alpha = 0.001
epoch_list = []
w_list = []
loss_list = []
# 进行epoch次梯度更新、损失函数计算
for epoch in range(100):
    # 计算所有数据的损失函数
    l = loss(x_data, y_data)
    l.backward()
    # 梯度更新
    w.data = w.data - alpha * w.grad.data
    w.grad.data.zero_()
    w_list.append(w.data)
    epoch_list.append(epoch)
    loss_list.append(l.data.numpy()[0])
plt.plot(epoch_list, loss_list)
plt.xlabel("epoch")
plt.ylabel("loss_sum")
plt.show()

B站刘二大人-反向传播Lecture4_第2张图片
两种方式跑出来的图在 损失下降率、结果有一定的差别。
目前我也有疑问,不知道那种合适。
B站老师写的是第一个代码

你可能感兴趣的:(PyTorch使用,python,机器学习,深度学习)