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

训练风格迁移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:

  1. 在数据预处理管道中添加强制resize操作,覆盖原图像尺寸:
    from torchvision import transforms
    
    transform = transforms.Compose([
        transforms.Resize((256, 256)),  # 强制将图像转为256x256
        transforms.ToTensor(),
        # 其他预处理步骤...
    ])
    
  2. 遍历数据集,手动清理或转换尺寸不符的图像,避免异常数据混入。

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:45:42