You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch迁移CycleGAN到GPU时触发输入与权重类型不匹配错误

问题原因

错误根源是Generator类中定义down_blocks和up_blocks时的语法错误,你错误地将两个属性赋值为普通Python列表,而非PyTorch的nn.ModuleList实例:

# 错误写法(多余的等号,直接将变量赋值为普通列表)
self.down_blocks = nn.ModuleList = ([
    ConvBlock(num_features, num_features*2, kernel_size=3, stride=2, padding=1),
    ConvBlock(num_features*2, num_features*4, kernel_size=3, stride=2, padding=1),
])
self.up_blocks = nn.ModuleList = ([
    ConvBlock(num_features*4, num_features*2, down=False, kernel_size=3, padding=1, stride=2, output_padding=1),
    ConvBlock(num_features*2, num_features, down=False, kernel_size=3, padding=1, stride=2, output_padding=1),
])

PyTorch的module.to(device)方法只会递归处理注册为模块子属性的可训练参数,普通列表中的子模块不会被PyTorch识别为模型的一部分,因此调用gen.to(DEVICE)时,down_blocks和up_blocks内部的卷积层参数仍然留在CPU上,和已经迁移到GPU的输入张量类型不匹配,触发报错。CPU运行正常是因为输入和参数都默认在CPU设备,不存在类型不匹配的问题。

修复方案

将两个列表的赋值修改为正确的nn.ModuleList实例化写法,删除多余的等号,将列表传入nn.ModuleList构造函数:

# 修复后的写法
self.down_blocks = nn.ModuleList([
    ConvBlock(num_features, num_features*2, kernel_size=3, stride=2, padding=1),
    ConvBlock(num_features*2, num_features*4, kernel_size=3, stride=2, padding=1),
])

self.up_blocks = nn.ModuleList([
    ConvBlock(num_features*4, num_features*2, down=False, kernel_size=3, padding=1, stride=2, output_padding=1),
    ConvBlock(num_features*2, num_features, down=False, kernel_size=3, padding=1, stride=2, output_padding=1),
])
额外优化提示

你初始化Generator的代码存在参数传参错误:

# 原写法:第二个参数会被识别为num_features,而非num_residuals
gen = Generator(img_channels, 9).to(DEVICE)

Generator的参数顺序为(image_channels, num_features= 64, num_residuals=9),如果需要指定残差块数量为9,应使用关键字参数避免覆盖默认的特征维度配置:

# 正确传参写法
gen = Generator(img_channels, num_residuals=9).to(DEVICE)

内容的提问来源于stack exchange,提问作者Shary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:30:01