Conv2D维度计算方法及GAN生成器转置卷积维度异常疑问
Conv2D与ConvTranspose2D维度计算详解及GAN生成器维度问题排查
一、Conv2D(正向卷积)维度计算公式
对于2D卷积层,输出特征图的尺寸计算遵循以下公式:
H_out = floor((H_in - K + 2*P) / S) + 1 W_out = floor((W_in - K + 2*P) / S) + 1
其中:
H_in/W_in:输入特征图的高/宽K:卷积核的边长(假设正方形核)P:填充(padding)的像素数S:步长(stride)floor():向下取整操作
举个例子:输入尺寸5x5,K=3,S=1,P=0,输出尺寸为(5-3+0)/1 +1 = 3,即3x3。
二、ConvTranspose2D(转置卷积)维度计算公式
你误用了Conv2D的公式来计算转置卷积的输出,这是核心错误:转置卷积是正向卷积的反向操作,尺寸计算逻辑完全不同,正确公式为:
H_out = (H_in - 1)*S - 2*P + K + OP W_out = (W_in - 1)*S - 2*P + K + OP
其中:
OP:输出填充(output_padding),可选参数,用于微调尺寸以避免歧义,通常取0或1- 其余参数定义与Conv2D一致
三、你的GAN生成器维度问题排查
你的生成器输入是torch.Size([128, 74, 1, 1]),即批量大小128,通道数74,特征图尺寸1x1,第一块转置卷积输出3x3。代入转置卷积公式反推参数:
假设该层参数为kernel_size=3,stride=1,padding=0,output_padding=0,计算过程为:
H_out = (1-1)*1 - 2*0 +3 +0 = 3
正好匹配实际输出的3x3。
如果误用Conv2D的公式计算:
H_out = floor((1-3 + 2*0)/1) +1 = floor(-2)+1 = -1
(你得到0可能是框架对负数取整的处理差异,但本质是公式用错了)
四、生成器尺寸放大的典型逻辑
你的生成器是从1x1的潜在向量(拼接64维latent和10维类别标签后通道数为74)逐步放大到目标尺寸,后续的6x6输出可以继续用转置卷积公式推导:
比如从3x3到6x6,可能的参数组合是kernel_size=4,stride=2,padding=1,output_padding=0:
H_out = (3-1)*2 -2*1 +4 +0 = 4 -2 +4 =6
完全符合预期。
排查建议
- 严格区分Conv2D和ConvTranspose2D的计算公式,绝对不能混用
- 列出每一层转置卷积的
kernel_size、stride、padding、output_padding参数 - 代入转置卷积公式逐层计算,和实际输出尺寸对比验证
- 若计算结果与实际存在1像素差异,检查是否设置了
output_padding=1
内容的提问来源于stack exchange,提问作者GrGr11
相关产品推荐
相关产品推荐

