# 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
pytorch官网教程:autograd代码理解
最新推荐文章于 2023-06-13 08:59:43 发布