为什么我在 forward 函数中定义的张量不能自动转换为 cuda 变量?

Why my tensor defined in forward function can not be transformed in to cuda variable autonomously?

在 PyTorch 中,在模型的 forward 函数中

class my_model(torch.nn.module):

    ......

    def forward():
        self.a=torch.zeros(1)
        #blabla

model.cuda()之后,为什么self.a还是一个cpu变量?

这是设计使然。

只有作为模型一部分的张量会随 model.cuda()model.to("cuda") 移动。

这些张量已注册到 register_parameterregister_buffer。这还包括使用上述函数注册的子模块、参数和缓冲区。

即使 self.a=torch.zeros(1) 实际上是 class 本身的一部分,按照设计它不会被移动到 CUDA,相反你需要做 a.to("cuda"),如果你没有没有使用 register* 方法。

一个解决方案:

device=whatever_parameter_in_your_forward_function_args.device
self.a=torch.zeros(1).to(device)