Pytorch Tensorboard Add_graph "Cannot insert a Tensor that requires grad as a constant"



我正在尝试使用torch.utils.sensorboard来记录我的神经网络结构。但是,当我使用编写器的add_graph函数时,我遇到了以下错误:

Cannot insert a Tensor that requires grad as a constant. Consider making a parameter or input, or detaching the gradient.

然后,它打印一个形状张量(512512(,它等于模型输入和输出维度的隐藏层之一。

我使用的代码如下:

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
input_tensor = torch.Tensor(...., require_grads=False)
writer.add_graph(model, input_tensor)

我在谷歌上搜索了一下,但只发现了几条错误消息相同但原因完全不同的帖子。

库的版本为:

Python 3.8.12
pytorch                   1.10.1     py3.8_cuda11.3_cudnn8.2.0_0    pytorch
cudatoolkit               11.3.1
tensorboard                   2.7.0
CUDA Version: 11.2

如果没有看到您的模型,很难回答这个问题。我认为正在发生的事情是,你的模型有挂层,其中有(例如(卷积张量,这些张量尚未传递给gpu,因此不是参数。

尝试运行:

model.cuda()
model.parameters()

看看你是否得到了你期望的模型。

在我的案例中,我在跟踪一个pytorch术语中格式错误的模型时收到了错误消息。具体来说,nn.Module需要在内部注册所有层和子模块。如果层/模块未注册,但在跟踪过程中遇到,则会引发神秘的错误消息。

在大多数情况下,注册是在__init__期间通过以下任一方式完成的:

  • 将子模块分配为实例属性(nn.Module通过重写__setattr__来捕获这些属性(:self.module = ...
  • 通过self.add_module(...)self.register_module(...)显式

__init__中使用嵌套子模块或花哨逻辑时,注册失败的原因可能多种多样且微妙。打印的张量可能有助于找到丢失的模块。在任何情况下,检查是否所有直接子模块都出现在self._modules中应该是一个安全的选择。

这同样适用于参数(self._parameters(和缓冲区(self._buffers(。如果有疑问,nn.Module的源代码可能值得一看。

在我的案例中,我使用了一个数据类来捆绑多个子模块,而仅仅分配数据类就会导致nn.Module错过里面的实际子模块。

此错误消息可能还有其他原因,因为消息文本似乎不是对问题的描述,而是有所不同。无论如何,我想分享我的解决方案,因为我还没有在网上找到它。

相关内容

最新更新