detach()
一个没有的例子detach()
:
from torchviz import make_dot
x=torch.ones(2, requires_grad=True)
y=2*x
z=3+x
r=(y+z).sum()
make_dot(r)
绿色的最终结果r
是 AD 计算图的根,蓝色是叶张量。
另一个例子detach()
:
from torchviz import make_dot
x=torch.ones(2, requires_grad=True)
y=2*x
z=3+x.detach()
r=(y+z).sum()
make_dot(r)
这与以下内容相同:
from torchviz import make_dot
x=torch.ones(2, requires_grad=True)
y=2*x
z=3+x.data
r=(y+z).sum()
make_dot(r)
但是,x.data
是旧的方式(符号),x.detach()
是新的方式。
有什么区别x.detach()
print(x)
print(x.detach())
出去:
tensor([1., 1.], requires_grad=True)
tensor([1., 1.])
所以 x.detach()
是一种删除方法requires_grad
,你得到的是一个新的分离张量(从 AD 计算图分离)。
火炬.no_grad
torch.no_grad
实际上是一个类。
x=torch.ones(2, requires_grad=True)
with torch.no_grad():
y = x * 2
print(y.requires_grad)
出去:
False
来自help(torch.no_grad)
:
当您确定时,禁用梯度计算对推理很有用 | 你不会调用 :meth: Tensor.backward()
。它会减少内存| 否则会有的计算消耗requires_grad=True
。|
| 在这种模式下,每次计算的结果都会有 | requires_grad=False
,即使输入有requires_grad=True
.