PyTorch反向传播(B站刘二大大练习题)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
"""
刘二练习题,仿照demo简单实现反向传播
"""
import torch


x_data = [1.0, 2.0, 3.0]  # 输入
y_data = [2.0, 4.0, 6.0]  # 输出

w = torch.Tensor([1.0])  # 权重w
w.requires_grad = True  # 设置True,表示需要计算梯度


# 前馈
def forward(x):
    return x * w


# 单个样本的损失
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


print("预测值(训练之前):", 4, forward(4).item())

# 训练
for epoch in range(100):
    for x, y in zip(x_data, y_data):
        l = loss(x, y)  # 前向传播,计算loss
        l.backward()  # 反向传播
        print("\t 梯度:", x, y, w.grad.item())  # .item()是直接把值拿出来产生标量
        # 只要一做backward的时候,计算图就会被释放了
        w.data = w.data - 0.01 * w.grad.data  # 梯度下降,更新权重。   w.grad也是一个tensor,所以要取他的data(这里只是修改数值,用.data的时候不会生成计算图)。这里的0.01 是学习率

        w.grad.data.zero_()  # 更新完之后,对梯度清零

    print("进度:", epoch, l.item())

print("预测值(训练之后):", 4, forward(4).item())
0%