反向传播算法

# --------反向传播算法:把网络看成一张图,在图上传播梯度,根据链式法则把这个梯度求出来--------
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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值