PyTorch运行时报错输入与权重张量类型不匹配 已移至GPU仍报错如何解决
问题根因
- 你遇到的报错核心原因是
BrainModel自定义结构中存在未被PyTorch自动迁移到GPU的张量,.to(device)方法只会自动迁移模型中注册为nn.Parameter的可训练参数、以及通过register_buffer注册的固定缓冲张量,不在这个范围内的张量会一直停留在CPU,参与运算时就会触发类型不匹配。常见的两种场景:__init__方法中直接将自定义张量赋值为类普通属性,没有做注册处理forward方法中创建临时张量时没有指定device参数,默认在CPU生成
- 额外注意:你报错行之后的类型转换代码
out, labels = out.type(torch.FloatTensor), labels.type(torch.FloatTensor)同样存在问题,torch.FloatTensor默认是CPU类型,会把已经在CUDA上的输出和标签重新转回CPU,后续计算损失时也会触发同类报错。
修复方案
1. 修正模型定义部分
检查BrainModel的__init__方法,对所有自定义张量做对应注册处理:
# 错误写法:普通类属性张量不会被to(device)迁移 self.custom_kernel = torch.randn(3, 3) # 修正写法1:如果是可训练参数,封装为nn.Parameter self.custom_kernel = nn.Parameter(torch.randn(3, 3)) # 修正写法2:如果是不需要训练的固定张量,注册为buffer self.register_buffer('custom_kernel', torch.randn(3, 3))
2. 修正forward内部临时张量创建逻辑
所有forward方法内生成的临时张量,都指定device参数,优先用输入张量的device属性适配不同运行环境:
# 错误写法:默认在CPU生成张量 mask = torch.ones(sequences.shape[0], 128) # 修正写法:指定和输入一致的device mask = torch.ones(sequences.shape[0], 128, device=sequences.device)
3. 修正后续类型转换逻辑
替换固定CPU类型的转换写法,适配当前运行设备:
# 错误写法:固定转CPU张量 out, labels = out.type(torch.FloatTensor), labels.type(torch.FloatTensor) # 修正写法:统一转到当前设备 out, labels = out.to(device), labels.to(device)
内容的提问来源于stack exchange,提问作者ann whoorma
相关产品推荐
相关产品推荐

