4-反向传播


从这张图片,可以看出。不管我们有多少层,都可以化简成最简形式。我们添加的层就没有意义。
所以我们要对每一层的输出做非线性变换,增加模型的复杂程度,使它没法化简

反向传播的流程

pytorch的tensor数据结构


看到代码,要能把计算图构建出来,而不是简单的乘除运算


在上面这张图,w是tensor数据结构,x与w相乘前会自动转化为tensor数据结构。同时由于w需要计算梯度,所以y也需要计算梯度
每进行一次反向传播后,计算图就会释放(每次计算的计算图可能不会一样),下次计算再重新构建计算图

点击查看代码
import numpy as np
import matplotlib.pyplot as plt
import torch

w = torch.tensor([1.0])
w.requires_grad = True  # 需要进行梯度更新

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

def forward(x):
    return w * x # x会自己转化成tensor类型

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

for epoch in range(100):
    for x, y in zip(x_data, y_data):
        l = loss(x, y)
        l.backward()  # 反向传播,把梯度grad和值data存储到w这个tensor变量中
        w.data = w.data - 0.01 * w.grad.data  # 注意是对w.data进行更新,而不是w

        w.grad.data.zero_()  # 梯度清零

    print('epoch:', epoch, l.item(), w.data)

print(forward(4).item())


posted @ 2024-08-12 21:08  不是孩子了  阅读(3)  评论(0编辑  收藏  举报