训练风格迁移GAN时判别器出现卷积核尺寸超限错误
解决GAN风格迁移中判别器的尺寸不匹配错误
问题概述
训练风格迁移GAN时,将图像传入判别器触发如下错误:
RuntimeError: Calculated padded input size per channel: (1 x 1). Kernel size: (4 x 4). Kernel size can't be greater than actual input size
通过自定义PrintLayer观察张量尺寸发现,大部分输入图像为[10,3,256,256],但存在一批尺寸为[10,3,112,112]的图像,经过多层下采样后,最后一层卷积前的张量尺寸变为[10,1024,1,1],此时使用4x4卷积核因输入尺寸过小报错。
报错原因分析
当前判别器是为256x256固定尺寸图像设计的:
- 经过6次
stride=2的卷积后,256x256会逐步缩小为128→64→32→16→8→4,最后一层4x4卷积刚好输出1x1的结果 - 但112x112图像经过同样下采样后,尺寸变化为56→28→14→7→3→1,最后一层卷积前的尺寸是1x1,无法容纳4x4的卷积核
另外,你提到传入判别器前打印的图像都是256x256,但实际出现112x112,说明数据加载器(t_dl)的预处理环节存在漏洞,没有完全将所有图像统一到目标尺寸。
解决方案
方案1:强制统一数据集图像尺寸(推荐)
风格迁移任务通常使用固定尺寸输入,直接确保所有图像都转为256x256:
- 在数据预处理管道中添加强制resize操作,覆盖原图像尺寸:
from torchvision import transforms transform = transforms.Compose([ transforms.Resize((256, 256)), # 强制将图像转为256x256 transforms.ToTensor(), # 其他预处理步骤... ]) - 遍历数据集,手动清理或转换尺寸不符的图像,避免异常数据混入。
方案2:修改判别器结构以兼容任意尺寸
如果需要保留不同尺寸的输入,将最后一层卷积替换为自适应池化+全连接层,自动适配输入尺寸:
修改后的判别器最后几层:
discriminator = nn.Sequential( # ... 前面的卷积层保持不变 ... nn.Conv2d(1024, 1024, kernel_size=4, stride=2, padding=1, bias=False), nn.BatchNorm2d(1024), nn.LeakyReLU(0.2, inplace=True), # 新增自适应池化层,不管输入尺寸多少都输出1x1 nn.AdaptiveAvgPool2d((1, 1)), nn.Flatten(), nn.Linear(1024, 1), # 全连接层输出判别结果 nn.Sigmoid() )
方案3:添加数据加载时的尺寸校验
在自定义Dataset的__getitem__方法中添加尺寸检查,提前处理异常图像:
class CustomDataset(Dataset): def __getitem__(self, idx): img = load_image(self.image_paths[idx]) # 检查尺寸,不符合则强制resize if img.size != (256, 256): img = img.resize((256, 256)) # 转为张量等后续处理 return transform(img)
内容的提问来源于stack exchange,提问作者PA Nik
相关产品推荐
相关产品推荐

