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计算图分离)。
torch.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。