使用pytorch进行梯度运算
torch.Tensor是程序包的中心类。如果将其属性设置 .requires_grad为True,它将开始跟踪对其的所有操作。完成计算后,可以调用.backward()并自动计算所有梯度。该张量的梯度将累加到.grad属性中。
创建一个张量并设置requires_grad=True为跟踪张量
import torch
x = torch.ones(2, 2, requires_grad=True)
print(x)
运算
y = x + 2
print(y)
print(y.grad_fn)
输出
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
y是运算产生,存在梯度
z = y * y * 3
out = z.mean()
print(z, out)
结果
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>)
tensor(27., grad_fn=<MeanBackward0>)
.requiresgrad( … )requires_grad 可以更改现有Tensor的标志。如果未给出输入,则默认为False。
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
输出
False
True
<SumBackward0 object at 0x7fc4a70d31d0>
梯度计算
使用反向传播
out.backward()
$out=\frac{1}{4}\sum{i=1}^4 z_i,z=3(x+2)^2,\frac{\partial out}{\partial x}=\frac{3}{2}(x+2)=4.5|{x=1},$
数学上,如果具有向量值函数 $\overrightarrow{y} =f(\overrightarrow{x})$,然后是 $\overrightarrow{y}$关于$\overrightarrow{x}$是雅可比矩阵:
一般来说,torch.autograd是用于计算向量雅可比积的引擎。给定向量$v=(v_1,v_2…v_n)^T$,计算$J*v^T$,如果v 恰好是标量函数的梯度$l=g(\overrightarrow{y})$,则$v=( \frac{\partial l}{\partial y_1}… \frac{\partial l}{\partial y_n})^T$
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
输出
tensor([1030.3691, 653.3950, -535.1644], grad_fn=<MulBackward0>)
输入
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
输出
tensor([5.1200e+01, 5.1200e+02, 5.1200e-02])
.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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 摸黑干活!
评论