PyTorch CPU训练时输入与权重设备类型不匹配问题排查
问题原因与解决方案
核心原因
错误本质是输入张量在CPU(torch.FloatTensor),但模型权重却在GPU(torch.cuda.FloatTensor),二者设备不匹配导致运算失败。你虽然调用了model = myCNN().to(device),但实际存在未覆盖的权重设备问题。
针对性解决方法
1. 排查模型初始化/权重加载环节
- 如果
myCNN的__init__方法中,有手动给层参数调用.cuda()的代码,直接删除这类操作,让参数默认在CPU初始化。 - 如果加载了预训练权重,必须指定加载到CPU设备:
跳过这一步的话,预训练权重会默认加载到GPU,后续的state_dict = torch.load("pretrained_weights.pth", map_location=device) model.load_state_dict(state_dict).to(device)可能无法完全覆盖所有参数。
2. 确保model.to(device)执行时机正确
如果在调用model.to(device)之后,又动态添加了新的网络层,新层的参数会默认留在CPU,此时需要重新把整个模型转移到目标设备:
# 修改模型结构后,重新执行设备转移 model = model.to(device)
3. 强制CPU运行的终极方案
如果上述方法都无效,直接在代码最开头添加以下代码,彻底让PyTorch忽略GPU:
import os os.environ["CUDA_VISIBLE_DEVICES"] = "-1" # 屏蔽所有GPU设备 import torch device = torch.device("cpu")
或者用另一种方式强制禁用CUDA:
import torch torch.cuda.is_available = lambda: False device = torch.device("cpu")
4. 验证设备匹配情况
在训练循环中添加打印语句,快速定位问题:
# 训练循环内添加 print(f"Inputs device: {inputs.device}") print(f"Model first layer weight device: {next(model.parameters()).device}")
如果输出显示模型权重仍在GPU,说明model.to(device)未生效,回到前两步排查。
内容的提问来源于stack exchange,提问作者muser
相关产品推荐
相关产品推荐

