import torch #引入torch包
创建一个张量并设置requires_grad=True为跟踪张量
x = torch.ones(2,2,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>)
y是由于操作而创建的,因此具有grad_fn。
print(y.grad_fn)
出:
<AddBackward0 object at 0x7fe932553cc0>
进行更多操作 y
z = yy3
out =z.mean()
print(z,out)
出:
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
.requires_grad_( … )requires_grad 就地更改现有Tensor的标志。False如果未给出输入标志,则默认为。
a=torch.randa(2,2)
a=((a3)/(a-1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b=(aa).sum()
print(b.grad_fn)
出:
False
True
<SumBackward0 object at 0x7fe9325699b0>
现在让我们反向传播。因为out包含单个标量,out.backward()所以等效于out.backward(torch.tensor(1.))。
out.backward()
打印渐变d(out)/ dx
print(x.grad)
出:
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
x = torch.randa(3,requires_grad=True)
y=x2
while y.data.norm() < 1000;
y = y2
print(y)
出:
tensor([-1120.1870, 418.2499, -768.9868], grad_fn=
现在在这种情况下y不再是标量。torch.autograd 无法直接计算完整的雅可比行列式,但是如果我们只想要向量-雅可比积,只需将向量传递给 backward作为参数:
v = torch.tensor([0.1,1.0,0.0001])
y.backward(v)
print(x.grad)
出:
tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])
你还.requires_grad=True可以通过将代码块包装在 with torch.no_grad():
print(x.requires_grad)
print((x**2).requires_grad)
with torch.no_grad():
print((x**2).requires_grad)
出:
True
True
False
或者使用.detach()来获得具有相同内容但不需要渐变的新Tensor:
print(x.requires_grad)
y = x.detach()
print(y.requires_grad)
print(x.eq(y).all)
出:
True
False
tensor(True)