pytorch官网教程:autograd代码理解

# Autograd: 自动求导机制

#PyTorch 中所有神经网络的核心是 autograd 包,torch.Tensor是这个包的核心类。
#如果设置 .requires_grad 为 True,那么将会追踪所有对于该张量的操作
import torch
x = torch.ones(2,2,requires_grad=True)  #创建一个张量并设置 requires_grad=True 用来追踪他的计算历史
print(x)    #tensor([[1., 1.], [1., 1.]], requires_grad=True)

#对张量进行操作
y = x + 2
print(y)    #tensor([[3., 3.], [3., 3.]], grad_fn=<AddBackward0>)

print(y.grad_fn)    #<AddBackward0 object at 0x000001D6F5100AC8>, grad_fn已经被自动生成了

#对y进行一个操作
z = y * y * 3
out = z.mean()
print(z,out)# tensor([[27., 27.], [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

# .requires_grad_( ... ) 可以改变现有张量的 requires_grad属性。
# 如果没有指定的话,默认输入的flag是 False。
a = torch.randn(2,2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)  #False
a.requires_grad_(True)  #主义这里有“_”
print(a.requires_grad)  #True
b = (a * a).sum()
print(b.grad_fn)    #<SumBackward0 object at 0x000002004F7D5608>

#梯度
# 反向传播 因为 out是一个纯量(scalar),
# out.backward() 等于out.backward(torch.tensor(1))
out.backward()
print(x.grad)

#下面是一个雅可比向量积的例子
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000: #y.data.norm()将张量y中的每个元素平方,然后对它们求和,最后得到结果和的平方根。这些运算计算所谓的L2范数
    y = y * 2
print(y)    #,而是tensor([ -561.3829, -1019.7476,   191.2780], grad_fn=<MulBackward0>)

# y不再是个标量,torch.autograd无法直接计算出完整的雅可比行列,
# 但是如果我们只想要雅可比向量积,只需将向量作为参数传入backward
gradients = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(gradients)
print(x.grad)

# 如果.requires_grad=True但是你又不希望进行autograd的计算,
# 那么可以将变量包裹在 with torch.no_grad()print(x.requires_grad)           # True
print((x ** 2).requires_grad)    # True

with torch.no_grad():
    print((x ** 2).requires_grad)   #False
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值