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
相关产品推荐
相关产品推荐

