解题思路
本题可以使用直接模拟的方法实现二维空洞卷积。普通卷积核中相邻元素对应输入矩阵中的相邻位置,而空洞卷积中相邻卷积核元素之间需要间隔 d−1 个位置,因此卷积核的有效尺寸为:
Keff=K+(K−1)(d−1)
其中 K 是卷积核边长,d 是膨胀率。
P4939.第3题-2D 单通道空洞卷积(Dilated Convolution)底层实现
题目内容
空洞卷积(膨胀卷积)是卷积神经网络中扩大特征感受野且不增加参数 / 计算量的核心操作,广泛应用于语义分割等任务,本题要求基于原生语法 / 标准库手动实现单通道 2D 空洞卷积的底层逻辑,禁止调用任何卷积相关高级库函数。
计算逻辑详细步骤
步骤 1:输入特征图的 Padding 填充
对输入的 H×W 二维特征图进行常数 0 填充:在特征图的上下方向各填充 padding 层 0,左右方向也各填充 padding 层 0,得到尺寸为 (H+2×padding)×(W+2×padding) 的填充后特征图。
步骤 2:计算有效卷积核尺寸与输出特征图尺寸
有效卷积核尺寸(膨胀后的实际感受野尺寸):设原始卷积核尺寸为 K×K(K 为奇数),膨胀率为 dilation(记为 d),则有效核尺寸公式为:
Keff=K+(K−1)×(d−1)
(d=1 时,Keff=K,等价于普通卷积)
输出特征图尺寸:设输入特征图原始尺寸为 Hin×Win,步长为 stride(记为 s),填充为 padding(记为 p),则输出特征图的高和宽分别为:
Hout=⌊sHin+2p−Keff⌋+1
Wout=⌊sWin+2p−Keff⌋+1
步骤 3:滑动窗口遍历与空洞卷积核心计算
窗口滑动规则:以步长 stride 为间隔,在填充后的特征图上滑动有效尺寸为 Keff 的窗口,窗口总数对应输出特征图的 Hout×Wout 个位置;
空洞卷积乘加规则:对每个滑动窗口,无需给卷积核插入空洞(0),而是按膨胀率 dilation 间隔选取窗口内的元素与原始卷积核逐元素相乘:
- 设当前窗口在填充后特征图的起始坐标为 (istart,jstart);
- 遍历原始卷积核的每个位置 (ik,jk)(0≤ik<K,0≤jk<K),计算该位置对应填充后特征图的坐标:iin=istart+ik×d,jin=jstart+jk×d;
- 若 (iin,jin) 在填充后特征图的有效范围内,将填充后特征图的元素 padded[iin][jin] 与卷积核元素 kernel[ik][jk] 相乘,并累加到当前窗口的结果中;
- 结果赋值:每个窗口的乘加累加结果作为输出特征图对应位置 (iout,jout) 的数值。
步骤 4:输出结果
将所有窗口的计算结果整理为 Hout×Wout 的二维矩阵,作为最终输出。

输入描述
输入特征图的大小(H 和 W)
输入特征图的元素,共 H×W 个,且全部为整数
卷积核的大小(K),为奇数
卷积核的元素,共 K×K 个,且全部为整数
步长(stride)为 ≥1 的整数;
填充(padding)为正整数(仅支持常数 0 填充,输入特征图上下左右各填充 padding 层 0);
膨胀率(dilation)为 ≥1 的整数(dilation=1 时等价于普通 2D 卷积)。
输出描述
逐行返回卷积后的二维特征图
样例1
输入
4 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
3
1 0 -1 1 0 -1 1 0 -1
1
1
2
输出
-32 -8 -8 30
-20 -8 -8 18
说明
样例2
输入
3 3
1 2 3 4 5 6 7 8 9
3
1 0 -1 1 0 -1 1 0 -1
1
0
1
输出
6
说明
输入和卷积核都是 3×3 的矩阵,膨胀率为 1,此时等效于一个常规卷积
有效核尺寸 =3+(3−1)×0=3,输出尺寸 =(3+0−3)/1+1=1×1
窗口内元素乘加:1×1+2×0+3×(−1)+4×1+5×0+6×(−1)+7×1+8×0+9×(−1)=−8
样例3
输入
5 5
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
3
1 0 1 0 1 0 1 0 1
1
0
2
输出
5
说明
输入是 5×5 的卷积,卷积核为 3×3 的卷积
有效核尺寸 =3+(3−1)×1=5,输出尺寸 =(5+0−5)/1+1=1×1
按膨胀率 2 选取输入元素(间隔 1个元素):
输入窗口为 5×5,选取位置:(0,0)、(0,2)、(0,4)、(2,0)、(2,2)、(2,4)、(4,0)、(4,2)、(4,4)
乘加求和:1×1+1×1+1×1+1×1+1×1+1×1+1×1+1×1+1×1=9