在深度学习中,计算卷积后特征图(Feature Map)的尺寸是一个非常实用的基础技能,它能帮助你设计网络结构,确保层与层之间的连接正确。
通常我们使用统一的通用公式来计算,但如果涉及到膨胀卷积等复杂情况,公式会有所扩展。
🧮 核心计算公式
对于绝大多数标准卷积层,输出特征图的高度和宽度可以分别通过以下公式计算:
Hout=⌊Hin+2×P−KS⌋+1
H_{out} = \\left\\lfloor \\frac{H_{in} + 2 \\times P – K}{S} \\right\\rfloor + 1
Hout=⌊SHin+2×P−K⌋+1
Wout=⌊Win+2×P−KS⌋+1
W_{out} = \\left\\lfloor \\frac{W_{in} + 2 \\times P – K}{S} \\right\\rfloor + 1
Wout=⌊SWin+2×P−K⌋+1
参数含义:
- Hin,WinH_{in}, W_{in}Hin,Win: 输入特征图的高度和宽度。
- KKK: 卷积核大小。如果是长宽不同的卷积核,公式中分别对应 KhK_hKh 和 KwK_wKw。
- PPP: 填充大小。指在输入特征图的四周补零的圈数。
- SSS: 步幅。卷积核每次滑动的像素数。
- ⌊⋅⌋\\lfloor \\cdot \\rfloor⌊⋅⌋: 向下取整符号。因为特征图尺寸必须是整数,当计算结果不是整数时,需要舍弃小数部分。
⚙️ 进阶公式(包含膨胀卷积)
如果你在使用膨胀卷积,还需要考虑膨胀系数:
Hout=⌊Hin+2×P−D×(K−1)−1S⌋+1
H_{out} = \\left\\lfloor \\frac{H_{in} + 2 \\times P – D \\times (K – 1) – 1}{S} \\right\\rfloor + 1
Hout=⌊SHin+2×P−D×(K−1)−1⌋+1
- DDD: 膨胀系数。当 D=1D=1D=1 时,就是标准卷积。
🤔 两种常见的填充模式
在实际搭建网络时,框架通常提供两种便捷的填充模式,你可以直接使用,无需手动计算 PPP:
- 不进行填充,即 P=0P = 0P=0。
- 输出尺寸通常会变小。
- 自动计算填充大小 PPP,使得输出特征图的尺寸与输入相同(前提是步幅 S=1S=1S=1)。
- 注意:这里的 “Same” 指的是尺寸相同,而不是填充方式。框架会根据卷积核大小自动推算需要补多少圈零。
💡 举个例子
假设输入图像大小为 224×224224 \\times 224224×224,使用一个 7×77 \\times 77×7 的卷积核,步幅为 2,填充为 1。
将参数代入公式计算高度(宽度计算方式相同):
- Hin=224H_{in} = 224Hin=224
- P=1P = 1P=1
- K=7K = 7K=7
- S=2S = 2S=2
Hout=⌊224+2×1−72⌋+1=⌊2192⌋+1=109+1=110
H_{out} = \\left\\lfloor \\frac{224 + 2 \\times 1 – 7}{2} \\right\\rfloor + 1 = \\left\\lfloor \\frac{219}{2} \\right\\rfloor + 1 = 109 + 1 = 110
Hout=⌊2224+2×1−7⌋+1=⌊2219⌋+1=109+1=110
所以,输出特征图的尺寸将是 110×110110 \\times 110110×110。
📊 其他层的计算公式
为了方便你整体设计网络,这里也列出了池化层和全连接层的尺寸变化:
| 卷积层 | (B, C_in, H, W) | (B, C_out, H_out, W_out) | 通道数变为卷积核数量 |
| 池化层 | (B, C, H, W) | (B, C, H_out, W_out) | 通道数不变,通常 P=0P=0P=0 |
| 全连接层 | (B, N_in) | (B, N_out) | 尺寸直接变为设定的输出神经元个数 |
(注:B 为批量大小,C 为通道数)


