卷积层的输出尺寸和参数量怎么计算?
简化版
输出尺寸公式:输出边长 = ⌊(输入边长 - 卷积核大小 + 2×填充) / 步长⌋ + 1,记作 O = (W - K + 2P)/S + 1。其中 K=核大小、P=padding 填充、S=stride 步长。padding(补零)用来控制输出尺寸(same 填充可保持尺寸不变),步长 S>1 会成倍缩小输出。参数量公式:一个卷积层的参数 = (卷积核宽 × 卷积核高 × 输入通道数 + 1) × 输出通道数,即 (K×K×C_in + 1) × C_out(+1 是每个输出通道的偏置)。关键:卷积参数量只和核大小、通道数有关,与输入图像的宽高无关(权值共享),这正是 CNN 参数少的原因。
详细版
输出尺寸计算:
O = ⌊(W - K + 2P) / S⌋ + 1
W=输入边长, K=核大小, P=padding, S=stride
例:输入 32×32、核 5×5、padding 0、步长 1 → (32-5+0)/1+1 = 28 → 输出 28×28。
Padding 的作用:
| padding | 效果 |
|---|---|
| valid(P=0) | 不填充,输出比输入小 |
| same | 填充使输出尺寸=输入(步长为1时) |
参数量计算(一个卷积层):
参数量 = (K_h × K_w × C_in + 1) × C_out
└── 每个卷积核的权重 ──┘ +1偏置 × 卷积核数量
例:输入通道 3、核 3×3、输出通道 64 → (3×3×3 + 1) × 64 = 1792 个参数。
关键: 参数量与输入宽高无关(权值共享),只和核大小、输入/输出通道数有关。
完整版教学
一、为什么要会算——设计和面试都要
搭建 CNN 时,要知道每层卷积后特征图变成多大(决定后续层怎么接、感受野多大)、参数量多少(决定模型大小和计算量)。这两个计算是 CNN 的基本功,面试也常直接考。核心是两个公式:输出尺寸公式和参数量公式。
二、输出尺寸公式
卷积核在输入上滑动,输出特征图的边长由输入尺寸、核大小、填充、步长共同决定:
O = ⌊ (W - K + 2P) / S ⌋ + 1
- W:输入的边长(宽或高,方形图宽高一样)。
- K:卷积核大小(如 3、5)。
- P:padding(每边填充的像素数)。
- S:stride(步长,卷积核每次滑动的格数)。
- ⌊⌋ 是向下取整。
推导直觉:填充后有效输入边长是 W+2P;卷积核要放得下,最后一个位置在 W+2P-K 处;以步长 S 滑动,能放的位置数是 (W+2P-K)/S + 1。
例子:输入 32×32,核 5×5,无填充(P=0),步长 1:
O = (32 - 5 + 0)/1 + 1 = 28 → 输出 28×28
再如输入 224×224,核 3×3,P=1,S=2:O = (224-3+2)/2 + 1 = 112 → 输出 112×112(步长 2 尺寸减半)。
三、Padding(填充)的作用
padding 是在输入边缘补零,用来控制输出尺寸、保护边缘信息:
- valid(P=0,不填充):卷积后输出比输入小(每次卷积都缩边)。多层卷积会让特征图不断缩小。
- same(合适的填充):填充到让输出尺寸 = 输入尺寸(步长为 1 时)。对 3×3 核,P=1 即可保持尺寸;5×5 核 P=2。
为什么需要 padding:
- 保持尺寸:不想让特征图每层都缩小时用 same 填充。
- 保护边缘信息:不填充时边缘像素被卷积核覆盖的次数少,信息利用不足;填充让边缘也能充分参与。
四、Stride(步长)的作用
stride(步长) 是卷积核每次滑动的距离:
- S=1:逐格滑动,输出尺寸大(保留最多信息)。
- S>1:跳格滑动,输出尺寸成倍缩小(S=2 大致减半),起到下采样作用——可以替代池化来降维(步长卷积,现代架构常用)。
步长越大,输出越小、计算越少,但损失的空间细节越多。
stride 表示卷积窗口相邻落点的间隔,大于 1 时会下采样输出空间尺寸并降低后续计算。它同时改变采样相位,若缺乏低通处理,细节可能混叠而不是简单地“压缩”。手算输出尺寸时 stride 位于分式分母,最终还要按框架的 floor、ceil 或 SAME 规则取整。
五、参数量公式(重点)
一个卷积层的参数量(要学习的权重数):
参数量 = (K_h × K_w × C_in + 1) × C_out
- K_h × K_w:一个卷积核的空间大小(如 3×3=9)。
- C_in:输入通道数(每个卷积核要覆盖所有输入通道,所以乘 C_in)。
- +1:每个输出通道的偏置。
- C_out:卷积核的数量 = 输出通道数(每个核产出一张特征图/一个输出通道)。
例子:输入通道 3(RGB),核 3×3,输出通道 64:
参数量 = (3×3×3 + 1) × 64 = (27+1)×64 = 28×64 = 1792
六、关键洞察:参数量与输入宽高无关
注意参数量公式里没有输入图像的宽 W 和高 H!参数量只取决于核大小、输入通道数、输出通道数。
这正是权值共享的体现(详见局部连接与权值共享专题):同一个卷积核在整张图滑动、共用一套权重,所以不管输入是 32×32 还是 1024×1024,一个卷积层的参数量都一样。
对比全连接层:全连接参数 = 输入维度 × 输出维度,直接和输入尺寸挂钩、动辄百万。卷积层参数和输入分辨率解耦——这就是 CNN 参数远少于全连接的根本原因。
(注意:参数量和输入尺寸无关,但计算量(FLOPs) 和输入尺寸有关——输出特征图越大、卷积要算的位置越多。别把参数量和计算量搞混。)
七、把 dilation、非方形尺寸与 groups 一次算全
二维卷积应分别计算高和宽,膨胀后的有效核为 K_eff=d×(K-1)+1。设输入 31×28,核 3×5,dilation=2×1,padding=2×2,stride=2×1,则有效核为 5×5;输出高为 floor((31+4-5)/2)+1=16,输出宽为 floor((28+4-5)/1)+1=28。
Hout = floor((Hin + 2Ph - Dh*(Kh-1) - 1)/Sh) + 1
Wout = floor((Win + 2Pw - Dw*(Kw-1) - 1)/Sw) + 1
params = Kh*Kw*(Cin/groups)*Cout + (bias ? Cout : 0)
若 C_in=16、C_out=32、groups=2,本例权重参数量为 3×5×8×32=3840,启用偏置则再加 32。参数量不随 H、W 增长,但输出位置数会影响 MACs;每个输出元素约需 K_h×K_w×C_in/groups 次乘加。
面试手算前先确认框架是否允许非对称 padding、是否计偏置,以及题目要 FLOPs、MACs 还是参数量。
八、常见误区与追问
- 误区:SAME padding 在任何 stride 下都保持输入尺寸。 许多框架在 stride 大于 1 时输出为
ceil(input/stride)。 - 误区:卷积参数量需要乘输出高和宽。 那是计算量的一部分,参数由核、通道、groups 和偏置决定。
- 追问:dilation 如何影响有效核? 有效核是
d×(K-1)+1,空洞增大覆盖范围但不增加核权重数。 - 追问:分组卷积为什么要求通道可整除? 每组需要分到整数个输入和输出通道,框架通常要求两者可被 groups 整除。
- 追问:为什么 Conv+BN 常关闭 bias? BN 的可学习平移通常使卷积偏置冗余,可省少量参数。
九、加强记忆
输出尺寸:O = ⌊(W - K + 2P)/S⌋ + 1(W 输入边长、K 核大小、P 填充、S 步长);padding 控制尺寸(same 保持不变、valid 缩小)并保护边缘,stride>1 下采样成倍缩小(可替代池化)。参数量:(K_h×K_w×C_in + 1) × C_out(一个核的权重 × 输入通道 + 偏置,再乘核数量/输出通道)——例:输入通道 3、核 3×3、输出 64 → (27+1)×64=1792。关键洞察:卷积参数量与输入图像宽高无关(权值共享),只和核大小、输入/输出通道有关,这是 CNN 参数远少于全连接的根本;但计算量与输入尺寸有关,别和参数量混淆。