【Pytorch深度学习实践】B站up刘二大人之 BackPropagation-代码理解与实现(3/9)

开篇几句题外话:

  • 10月份再回头看这段内容,把所有不懂得全都看懂了:
    • graddata,是一个pytorch当中的Tensor类型的元素的两个属性Attribute,其中data是数值了,而grad仍然是Tensor类型,如果想获得数据的grad的数值,那么,必须要这样:loss.grad.data
    • 当使用了l = loss(x,y),那么,就是构建了从xy计算图模型
    • 而再用l.backward(),就是在做反向传播了,此时计算图被清空;
    • 上一步反向传播之后,所有的计算单位,都拥有了损失函数关于自己的梯度,直接就可以这样用:x.gradx.data,等等;
    • 在每一次更新权重的时候,一定要记住,必须用wdata属性,也就是数值去计算更新后的权重;
    • 更新权重之后,要把权重清零,这是为了下一次循环时,再次构建计算图模型所做的准备;
    • 至于本节最后提到的item()方法,那是pythonpytorch基础里的内容,是针对只有一个元素的容器,所做的处理;
    • 有一个需要注意的地方,就是计算loss的时候,如果求和,必须用其data属性,否则是计算图的叠加;如:sum += l
  • 以往的代码,都是随便看看就过去了,没有这样较真过,以至于看了很久的深度学习和Python,都没有能够形成编程能力;
  • 这次算是废寝忘食的深入进去了,踏实地把每一个代码都理解透,包括其中的数学原理(目前涉及的还很浅)和代码语句实现的功能;也是得益于疫情封闭在寝室,才有如此踏实的心情和宽松的时间,最重要的是周边的环境,没有干扰。

Lecture04——BackPropagation 反向传播

  • 本课程的主要任务是利用torch包的requires_grad自动求导,构建反向传播模型:
    • 导入numpymatplotlib库;

    • 导入数据 x_datay_data

    • 初始化一个w数值,这里要用torch.Tensor构建;

    • wrequires_grad 参数打开;(重点)

    • 定义前向传播函数:

      • forward:输出是预测值y_hat
    • 定义损失函数:

      • loss:损失函数定义为MSE:均方根误差
    • 定义梯度计算函数:

      • gradient: 需要根据反向传播,计算出代价函数对于权重的梯度,计算结果为grad += 2 * x * (x * w - y);
    • 创建两个空列表,因为后面绘图的时候要用:

    • 开始训练:

      • 外层循环,循环的次数epoch可以自定义:
      • 内层循环:核心计算内容
        • 从数据集中,按数据对儿取出自变量x_val和真实值y_val;
        • 直接调用loss函数,计算单个数据的损失数值;
        • backward函数直接对损失值做反向传播;
        • 核心来了——更新权重:
          • wgrad.data 做更新,这是重要一步,也是内容非常丰富的地方,不仅是更新了权重,里面还有关于 tensor 的其他基础知识, datagrad 的关系, data 是不会构建计算图的,而 grad 是在构建计算图模型;
        • 此处仍不涉及权重清零的问题(TBD);
        • 随意打印想要看到的内容,一般是打印x_valy_valloss_val
        • 在循环中要把计算的结果,放进之前的空列表,用于绘图;
  • 在获得了打印所需的数据列表只有,模式化地打印图像:

完整代码:

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: 24_nemo
@file: 04_BackPropagation_handType.py
@time: 2022/04/08
@desc:
"""
import torch
import numpy as np
import matplotlib.pyplot as plt

import os

os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

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

w = torch.Tensor([1.0])
w.requires_grad = True


def forward(x):
    return x * w


def loss(x, y):
    y_hat = forward(x)
    return (y_hat - y) ** 2


def gradient(x, y):
    return 2 * x * (x * w - y)


print('Predict (before training)', 4, forward(4))

epoch_list = []
loss_list = []

for epoch in np.arange(100):
    for x, y in zip(x_data, y_data):
        loss_val = loss(x, y)
        loss_val.backward()
        print('\tgrad:', x, y, w.grad.item())
        w.data -= 0.01 * w.grad.data
        epoch_list.append(epoch)
        loss_list.append(loss_val.item())  # 往列表里添加的内容,不可是tensor类型,或者item(),或者.detach().numpy()取出来
        w.grad.data.zero_()

    print('process:', epoch, loss_val.item())

print('Predict(after training)', 4, forward(4).item())

plt.plot(epoch_list, loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

运行结果:

【Pytorch深度学习实践】B站up刘二大人之 BackPropagation-代码理解与实现(3/9)_第1张图片

【Pytorch深度学习实践】B站up刘二大人之 BackPropagation-代码理解与实现(3/9)_第2张图片

默写出的错误:

经过修改之后的代码:

import torch
import numpy as np
import matplotlib.pyplot as plt

import os

os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'

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

# w = torch.Tensor([1.0])
# w.requires_grad = True

w = torch.Tensor([1.0])
w.requires_grad = True


def forward(x):
    return x * w


def loss(x, y):
    y_hat = forward(x)
    return (y_hat - y) ** 2


def gradient(x, y):
    return 2 * x * (w * x - y)


loss_list = []
epoch_list = []


for epoch in np.arange(100):
    for x, y in zip(x_data, y_data):
        loss_val = loss(x, y)
        loss_val.backward()
        print('\tgrad:', x, y, w.grad.item())
        w.data -= 0.01 * w.grad.data
        epoch_list.append(epoch)
        loss_list.append(loss_val.item())

        w.grad.data.zero_()
    print('process:', epoch, loss_val.item())

print('Predict(after training)', 4, forward(4).item())

plt.plot(epoch_list, loss_list)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()


运行结果:

【Pytorch深度学习实践】B站up刘二大人之 BackPropagation-代码理解与实现(3/9)_第3张图片

小结:我还是没有完全自己写明白

  • data grad item() detach.numpy这几个东西,还是没搞明白;(10月份搞明白了,这段视频还得继续听,细节很多)

上一篇:

【Pytorch深度学习实践】B站up刘二大人之 Gradient Descend-代码理解与实现(2/9)

下一篇:

【Pytorch深度学习实践】B站up刘二大人之LinearRegressionwithPyTorch-代码理解与实现(4/9)

目录:

【Pytorch深度学习实践】B站up刘二大人课程笔记——目录与索引(已完结)

你可能感兴趣的:(深度学习/PyTorch,Python/Pycharm,图像处理,深度学习,python,计算机视觉)