PyTorch:在哪种情况下,hook可以返回None梯度?

PyTorch:在哪种情况下,hook可以返回None梯度?,pytorch,Pytorch,下面是一个使用register\u hook和nn.Module的示例,我还使用.grad对丢失后的权重进行了双重检查。backward(): 输出: a.size() torch.Size([5]) b.size() torch.Size([6]) DEBUG: grad hook torch.Size([6, 5]) grad.size(): torch.Size([6, 5]) a.size() torch.Size([5]) b.size() torch.Size([5]) grad.

下面是一个使用
register\u hook
nn.Module
的示例,我还使用
.grad
丢失后的权重进行了双重检查。backward()

输出:

a.size() torch.Size([5])
b.size() torch.Size([6])
DEBUG: grad hook torch.Size([6, 5])
grad.size(): torch.Size([6, 5])
a.size() torch.Size([5])
b.size() torch.Size([5])
grad.size(): None
下面是一个更复杂的例子,使用
torch.no_grad()
(所以不调用hook):

输出:

a.size() torch.Size([5])
b.size() torch.Size([6])
DEBUG: grad hook torch.Size([6, 5])
grad.size(): torch.Size([6, 5])
a.size() torch.Size([5])
b.size() torch.Size([5])
grad.size(): None
这些输出是有效的,在第二个示例中,当gradient为None()时,不会调用hook

但是在实际的大项目中,我也有<代码> Trask.NoGead()/Cux>在体系结构中间的某个地方(我不能在简单的例子中复制),我从代码中得到了<代码>没有< /代码>形状,并且从<代码>中得到了有效的形状。(我希望在

loss.backward()
)之后,
.grad
中的hook不调用,并且
None
形状,那么hook为什么可以返回
None
形状呢

另外,如果我只想检查梯度是否不是
None
使用
register\u hook
而不是
。grad
loss.backward()