在 Pytorch 中,当传输到 GPU 时,我收到一个错误“在 CPU 上,但应该在 GPU 上”
Posted
技术标签:
【中文标题】在 Pytorch 中,当传输到 GPU 时,我收到一个错误“在 CPU 上,但应该在 GPU 上”【英文标题】:In Pytorch, when transferring to GPU, I get an error "is on CPU, but expected to be on GPU" 【发布时间】:2021-05-04 05:25:46 【问题描述】:错误示例:“'out' 的张量在 CPU 上,参数 #1 'self' 的张量在 CPU 上,但预计它们在 GPU 上”。我被困在分类教程上:
https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html
注意:代码用于回归。
代码如下:
class Net(nn.Module):
def __init__(self, num_features, size_hidden_layer, n_hidden_layer):
super(Net, self).__init__()
self.size_hidden_layer = size_hidden_layer
self.n_hidden_layer = n_hidden_layer
self.hidden_layers = list()
self.hidden_layers.append(nn.Linear(num_features, size_hidden_layer))
for _ in range(n_hidden_layer-1):
self.hidden_layers.append(nn.Linear(size_hidden_layer, size_hidden_layer))
self.last_layer = nn.Linear(size_hidden_layer, 1)
def forward(self, x):
for i in range(self.n_hidden_layer):
x = torch.relu(self.hidden_layers[i](x))
return self.last_layer(x)
【问题讨论】:
【参考方案1】:教程部分没有提到的是,必须包装参数才能被 GPU 读取。例如,查看__init__
,其中正常和神经网络层被包裹在nn.Sequential
中。
class Net(nn.Module):
def __init__(self, num_features, size_hidden_layer, n_hidden_layer):
super(Net, self).__init__()
self.size_hidden_layer = size_hidden_layer
self.n_hidden_layer = n_hidden_layer
hidden_layers = list()
hidden_layers.append(nn.Linear(num_features, size_hidden_layer))
for _ in range(n_hidden_layer-1):
hidden_layers.append(nn.Linear(size_hidden_layer, size_hidden_layer))
self.hidden_layers = nn.Sequential(*hidden_layers)
self.last_layer = nn.Linear(size_hidden_layer, 1)
def forward(self, x):
for i in range(self.n_hidden_layer):
x = torch.relu(self.hidden_layers[i](x))
return self.last_layer(x)
【讨论】:
这实际上与此无关:错误与您的张量在 CPU 上而您的模型在 GPU 上有关。size_hidden_layer
和 n_hidden_layer
不是模型的参数,优化方面。
当我用 nn.Sequential() 包裹它时,错误消失了,这是对另一个线程的回答,类似但我丢失了另一个问题/错误。所以我不知道你是什么意思。另外, size_hidden_layer 等是什么意思?我不小心将它们包装在 nn.Parameter 中,认为这样会更好(我是新手),但 ninja 编辑了它,因为它导致了错误,你是在说这个吗?
抱歉,我没有看到您添加了nn.Sequential
,是的,需要将图层注册到您的模块。至于size_hidden_layer
和n_hidden_layer
,我的意思是:它们不是模型的可优化参数(因为在优化模型时不需要更新它们),因此它们不需要包装在nn.Parameter
中。 以上是关于在 Pytorch 中,当传输到 GPU 时,我收到一个错误“在 CPU 上,但应该在 GPU 上”的主要内容,如果未能解决你的问题,请参考以下文章