在 pytorch 中的不同张量上调用 cuda() 时的奇怪行为

  • 本文关键字:cuda 调用 pytorch 张量 pytorch
  • 更新时间 :
  • 英文 :


我正在尝试在GPU设备上训练pytorch神经网络。为此,我将输入和网络加载到默认的启用 cuda 的 GPU 欺骗上。但是,当我加载输入时,模型的权重不会保持 cuda 张量。这是我的火车功能

def train(network: nn.Module, name: str, learning_cycles: dict, num_epochs):
# check we have a working gpu to train on
assert(torch.cuda.is_available())
# load model onto gpu
network = network.cuda()
# load train and test data with a transform
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
train_set = torchvision.datasets.CIFAR10(root='./data', train=True, 
download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_set, batch_size=128, 
shuffle=True, num_workers=2)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(network.parameters(), lr=0.001, momentum=0.9)
for epoch in range(num_epochs):
for i, data in enumerate(train_loader, 0):
inputs, labels = data
# load inputs and labels onto gpu
inputs, labels = inputs.cuda(), labels.cuda()
optimizer.zero_grad()
outputs = network(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()

呼叫火车时,我收到以下错误。

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

有趣的是,当我删除该行inputs, labels = inputs.cuda(), labels.cuda()时,我得到错误RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same

我非常想训练我的网络,我已经搜索了互联网无济于事。有什么好主意吗?

假设无论输入在哪个设备上,设备不匹配都会突然出现,因此当您调用network = network.cuda()时,模型的某些参数很可能没有移动到 GPU。您在 CPU 和 GPU 上都有模型参数。

发布您的模型代码。您的 Pytorch 模块可能位于不正确的容器中。

模块列表应位于nn. ModuleList中。Python 列表中的模块不会转移。比较

layers1 = [nn.Linear(256, 256), nn.Linear(256, 256), nn.Linear(256, 256)]
layers2 = nn.ModuleList([nn.Linear(256, 256), nn.Linear(256, 256), nn.Linear(256, 256)])

如果您在具有上述两行的模型上调用model.cuda(),则layer1中的层将保留在 CPU 上,而layer2中的层将移动到 GPU。

同样,nn.Parameter对象列表应包含在nn.ParameterList对象中。

还有字典容器的nn. ModuleDictnn.ParameterDict

最新更新