使用inception_v3做二分类遇RuntimeError:输入与权重张量类型不匹配
解决RuntimeError:输入与权重设备不匹配问题
问题根源
你只将输入图像和标签迁移到了CUDA设备,但模型本身仍在CPU上,导致输入(GPU张量)和模型权重(CPU张量)无法在同一设备上运算,触发类型不匹配错误。
修复步骤
将模型迁移到目标设备
在训练循环开始前,添加代码把模型移到指定设备上:model = model.to(device)注意:如果是加载预训练的InceptionV3,要确保这行代码在加载权重、修改模型适配二分类(比如替换最后全连接层)之后执行。
迁移损失函数到设备(可选但建议)
如果损失函数包含可训练参数,同样需要迁移到设备:criterion = criterion.to(device)确保优化器在模型迁移后初始化
优化器需要跟踪模型参数的设备位置,正确顺序是:# 1. 加载并修改模型 model = torchvision.models.inception_v3(pretrained=True) num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 2) # 2. 迁移模型到设备 model = model.to(device) # 3. 初始化优化器 optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
修改后的代码片段示例
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # --- 新增:迁移模型和损失函数到设备 --- model = model.to(device) criterion = criterion.to(device) for epoch in range(n_epochs): print("Epoch: %d "%(epoch+1)) model.train() running_loss = 0.0 running_correct = 0.0 total=0 for i, data in enumerate(train_loader): images,labels=data images=images.to(device) labels=labels.to(device) total+=labels.size(0) output,aux1,aux2=model(images) aux1_loss=criterion(aux1, labels) aux2_loss=criterion(aux2, labels) output_loss = criterion(output, labels) loss = output_loss + 0.3*(aux1_loss + aux2_loss) running_loss += loss.item() * output.size(0) pred = output.max(1, keepdim=True)[1] running_correct+=pred.eq(labels.view_as(pred)).sum().item() optimizer.zero_grad() loss.backward() optimizer.step() traning_accuracy = 100. * running_correct / len(train_loader.dataset)
额外检查点
- 验证CUDA可用性:执行
print(torch.cuda.is_available()),返回True说明GPU可用。 - 核对张量设备:打印
images.device和model.fc.weight.device,两者需一致(均为cuda:0)。
内容的提问来源于stack exchange,提问作者Bhanuprakash Vattikuti
相关产品推荐
相关产品推荐

