在训练深度学习模型时,遇到报错,RuntimeError: Expected nested_tensorlist[0].size() > 0 to be true, but got false. 谷歌搜索信息很少,有一条是说loss没有添加..backward()进行反向传播导致的,可见:
Expected nested_tensorlist[0].size() > 0 to be true, but got false - PyTorch Forums
但是我代码中有添加,询问gpt得到如下回答:
这个错误信息提示的问题是在尝试进行梯度裁剪时,遇到了一个或多个模型参数的梯度尺寸为零(即没有梯度)。这通常发生在以下几种情况:
-
未使用的参数:模型中可能存在一些未参与前向或反向传播的参数。例如,某些层可能因为模型的某种条件分支而没有被执行。
-
零梯度:某些参数在反向传播过程中可能得到了零梯度。这可能是因为模型的某部分没有得到有效的梯度更新。
解决这个问题的一种方法是在调用梯度裁剪之前,检查参数的梯度是否存在和有效。可以通过遍历模型参数并检查它们的 .grad
属性来实现。如果 .grad
是 None
或者梯度的尺寸为零,可以选择跳过这些参数的梯度裁剪。
修改代码如下,解决
loss.backward()
# nn.utils.clip_grad_value_(self.model.parameters(), clip_value=1.0)
for param in self.model.parameters():
if param.grad is not None and param.grad.nelement() > 0:
nn.utils.clip_grad_value_([param], clip_value=1.0)