3_Back Propagation

介绍了反向传播的相关知识,代码中有很多注释

# In PyTorch,Tensoris the importantcomponent in constructing dynamiccomputational graph.
# It containsdataandgrad, which storage the value of node and gradient and loss respectively.
import torch
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

# 为w创建Tensor变量,并且指名w需要计算梯度
# w相关的变量也会自动计算梯度
w=torch.Tensor([1.0])
w.requires_grad= True


# 注意:因为w是一个tensor,乘法已经被重载了
# 进行的是tensor之间的数乘,x自动类型转换变成tensor
# 这一步实际上是构建了一个最简单的计算图
# 因为w需要计算梯度,所以forward的那个输出也会计算梯度,并且也是tensor类型
def forward(x):
    return x*w


# y_pred也是tensor需要计算梯度,而这个函数返回值也一样
# loss和forward函数实际上就是构建了完整的计算图
# 我们每一次调用loss函数,就动态的建立了一个计算图
def loss(x,y):
    y_pred=forward(x)
    return (y_pred-y)**2


print('predict(before training)',4,forward(4).item())
# item()是吧tensor里面的数据拿出来变成标量

for epoch in range(100):
    for x,y in zip(x_data,y_data):
        l=loss(x,y)      # 前馈过程,很简单
        l.backward()     
        # 自动计算l的计算图上所有需要梯度
        # 并且把梯度储存到w上(先前定义的)
        # 当存到w里后,计算图被释放(节省空间)
        print('\t grad:',x,y,w.grad.item())
        # item()是吧tensor里面的数据拿出来变成标量,这里grad是一个tensor,所以指的是取出grad的值
        w.data=w.data-0.01*w.grad.data
        # tensor中包含data、grad等数据,而grad实际上也是一个tensor
        # 所以我们如果想访问grad的值,我们需要再  .data 一下
        # 否则就是又进行了tensor之间的运算,又创建了计算图
        w.grad.data.zero_()
        # abckward后仅仅是计算图被释放,但是grad.data还在
        # 这一步实际上就是把它清空
    
    print('progress:',epoch,l.item())
print('predict(after training)',4,forward(4).item)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值