PyTorch-GPU运行时报错张量设备不统一,遗漏了哪些迁移到GPU的步骤
问题修复方案
报错原因
报错是因为计算损失时,模型输出在cuda设备上,而你没有将训练用的target标签和输入data移动到GPU,仍留在CPU上,导致设备不匹配。
遗漏操作修复步骤
- 首先清理冗余的
.cuda()调用,你现在给每个层、每个中间张量都加.cuda()的写法极易出错,且不利于CPU/GPU兼容,模型类修改为:
class NeuralNet(nn.Module): def __init__(self, gpu = True): super(NeuralNet, self ).__init__() self.fc1 = nn.Linear(28 * 28, 16) self.fc2 = nn.Linear(16, 10) def forward(self, x): x = x.view(-1, 28 * 28) x = F.relu(self.fc1(x)) x = self.fc2(x) return x
- 损失函数不需要额外加
.cuda(),删除这部分的冗余调用。 - 训练循环中新增张量移动逻辑,这是你之前漏掉的核心步骤:
for data, target in load_data.train_loader: # 新增两行,将输入和标签移动到对应设备 data = data.to(device) target = target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) # 后续逻辑保持不变
无需处处添加.cuda()的实现方法
你已经定义了通用设备变量device = torch.device('cuda' if torch.cuda.is_available() else 'cpu'),按以下规范写即可避免到处加.cuda():
- 常规兼容写法:所有需要在GPU计算的对象统一调用
.to(device)即可,仅需三类操作:- 模型实例化后调用
model = model.to(device) - 训练/验证时,将dataloader取出的
data和target调用.to(device) - 自己创建的张量(如自定义参数、掩码等)创建时指定
device=device参数
- 模型实例化后调用
- 全局默认设备写法(PyTorch 2.0+支持):
在代码开头加一行torch.set_default_device(device),之后所有新创建的张量、模型参数默认都会生成在指定设备上,不需要额外调用.to(device)。如果搭配DataLoader使用,给DataLoader新增参数generator=torch.Generator(device=device),即可让加载的数据直接生成在GPU上,不需要手动移动。
内容的提问来源于stack exchange,提问作者user10169965
相关产品推荐
相关产品推荐

