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

对pytorch中的不同张量调用cuda()时的奇怪行为,pytorch,Pytorch,我正在尝试在GPU设备上训练pytorch神经网络。为此,我将输入和网络加载到默认的支持cuda的GPU decive上。但是,当我加载输入时,模型的权重不会保持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_avail

我正在尝试在GPU设备上训练pytorch神经网络。为此,我将输入和网络加载到默认的支持cuda的GPU decive上。但是,当我加载输入时,模型的权重不会保持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()
调用train时,我得到以下错误

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same
有趣的是,当我删除行输入时,labels=inputs.cuda,labels.cuda我得到了错误RuntimeError:输入类型torch.FloatTensor和权重类型torch.cuda.FloatTensor应该是相同的


我非常想训练我的网络,我在互联网上搜索也没有用。有什么好主意吗?

如果不管输入在哪个设备上,都会出现设备不匹配,那么当您调用network=network.cuda时,您的模型的一些参数很可能没有移动到GPU。CPU和GPU上都有模型参数

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

模块列表应为nn格式。模块主义者。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.ParameterList对象中应包含nn.ParameterList对象的列表


还有nn。ModuleDict和nn.ParameterDict用于字典容器。

您可以添加模型的代码吗?我猜您网络中的部分张量没有存储在正确的pytorch中,因此在调用network.cuda时,其中一些张量没有移动到GPU。