我正在尝试使用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
错过里面的实际子模块。
此错误消息可能还有其他原因,因为消息文本似乎不是对问题的描述,而是有所不同。无论如何,我想分享我的解决方案,因为我还没有在网上找到它。