# Pytorch 解决自定义子Module .cuda() tensor失败的问题
## 1. 背景
在使用Pytorch进行深度学习时,遇到了一个问题:自定义的子Module中的tensor在使用.cuda()方法将其转移到GPU上时,出现了NotFoundError的错误提示。
## 2. 问题分析
经过查找,我们发现了造成该问题的原因。
我们在定义自定义的子Module时,通常会用到Pytorch中的一些model类,例如nn.Module等。
然而在Pytorch模型中,_parameters和_buffers是nn.Module中的两个实例变量,依赖这两个变量的参数转移到GPU时,需要重新生成一遍实例变量,但是因为自定义子Module的本质不同于nn.Module的本质,所以有些Module中不包含_parameters和_buffers这两个变量,这就会导致对这些Module使用.cuda()方法后,出现NotFoundError的错误提示。
## 3. 解决方法
我们在使用自定义的Module时,可以尝试以下方法来避免出现该问题。
### 3.1 使用nn.ModuleList
我们尝试将自定义Module存入nn.ModuleList中,调用该Module时再进行转移操作。
```Python
import torch.nn as nn
model_list = nn.ModuleList([CustomModule() for _ in range(N)])
for module in model_list:
module = module.cuda()
```
### 3.2 继承nn.Module
在创建自定义Module时,我们可以使用继承nn.Module的方法,并在__init__方法中添加需要使用的tensor。
```Python
import torch.nn as nn
import torch.nn.functional as F
class CustomModule(nn.Module):
def __init__(self, in_channels, out_channels):
super(CustomModule, self).__init__()
self.weight = nn.Parameter(torch.randn(in_channels, out_channels))
self.bias = nn.Parameter(torch.randn(out_channels))
def forward(self, x):
x = F.linear(x, self.weight, self.bias)
return x
```
### 3.3 使用nn.Sequential
参照使用nn.ModuleList的方法,我们也可以使用nn.Sequential来存储自定义Module。
```Python
import torch.nn as nn
model_container = nn.Sequential(CustomModule1(),
CustomModule2())
for module in model_container:
module = module.cuda()
```
## 4. 总结
以上是解决自定义Module中.tensor在使用.cuda()方法时出现NotFoundError的报错的方法,除此之外,还可以使用更改输入数据类型等方法来解决该问题。
但无论采用哪种方法,我们都要时刻保持Pytorch的正确使用,这样才能保证我们的深度学习效果更佳。