# --------反向传播算法:把网络看成一张图,在图上传播梯度,根据链式法则把这个梯度求出来--------
import torch
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# Tensor可以存张量,包括Data:权重w Grad:梯度
# w 是一个初始值为 1.0 的权重张量,并且通过 requires_grad=True 开启自动求导功能,
# 这意味着所有对 w 的操作都将被记录用于梯度计算
w = torch.Tensor([1.0])
w.requires_grad = True
def forward(x):
# w是一个张量,在进行乘法运算时,这个运算符实际上已经被重载了,此时要将x进行自动类型转换,把它转换成一个tensor
return w * x
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) ** 2
# 输出f(4)训练前的值
print('Predict(before training)', 4, forward(4).item())
# 进行100次训练
for epoch in range(100):
# 对每个数据点进行训练
for x, y in zip(x_data, y_data):
# 前馈过程中只需要计算loss的值,注意算出来的loss是张量
l = loss(x, y)
# 反馈过程中,调用l.backward()自动计算损失函数关于权重w的梯度,并把梯度都存到w中
# 存到w中之后,这个计算图就被释放了,下次再进行loss计算时,会重新创建一个新的计算图
l.backward()
# .item() 方法用于获取这个张量的单个数值,通常在需要输出或记录损失时使用
print('\tgrad:', x, y, w.grad.item())
# 做一个纯数值的修改,w.grad.data返回的是一个张量 w.grad,其中包含了权重w相关的梯度信息
w.data -= 0.01 * w.grad.data
# 将权重里梯度的数据全部清零
w.grad.data.zero_()
print('progress:', epoch, l.item()) # 打印的是这一轮最后一次的训练的loss
print('Predict(after training)', 4, forward(4).item())
反向传播算法
最新推荐文章于 2024-11-12 12:29:51 发布