我正在尝试在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. ModuleDict
和nn.ParameterDict
。