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