多通道卷积是卷积神经网络(CNN)中的核心运算。其本质是:在每个滑动位置,将输入在所有通道上的同形窗口与对应通道的卷积核做元素乘加(逐通道累加),得到一个标量作为该位置的输出值。
填充(padding) 按题意在输入张量四周补零,得到形状为 (C,Hin+2p,Win+2p) 的新张量(p=padding)。
滑动窗口(stride)
卷积神经网络常用于图像分类、检测与分割等图像任务。多通道卷积的计算公式是卷积神经网络 (CNN) 中的核心运算,请用代码实现多通道卷积操作。
输入: input: 形状为 (C,H_in,W_in) 的输入张量,C 为输入通道数,H_in 为输入高度,W_in 为输入宽度
kernel: 形状为 (C,K_h,K_w) 的卷积核,C 为输入通道数(和 input 的 C 数值相同),K_h 为输入高度,K_w 为输入宽度
stride:卷积步长(大于等于 1 的整数)
其中
0<C<6
2<H_in<10
2<W_in<10
0<K_h<7
0<K_w<7
0<stride<4
0=<padding=<3
卷积操作过程说明:
1.填充:在输入张量的上下左右各填充 “0” ,填充后的形状为 (C,H_in+2padding,W_in+2padding)。
2 滑动窗口计算:从填充后的输入张量的左上角开始,按照 stride 步长滑动卷积核,每次取与卷积核形状相同的子区域。若剩余区域尺寸小于卷积核尺寸,则跳过该位置。
3,逐通道计算:对于每个子区域,将卷积核与对应位置的输入值逐通道相乘后求和(中间计算过程不做四舍五入),得到输出张量的一个值,计算公式为:$\operatorname{output}(i, j)=\sum_{c=0}^{C-1} \sum_{m=0}^{K_{b}-1} \sum_{n=0}^{K_{n}-1} \text { input }_{c}(i \times \text { stride }+m, j \times \text { stride }+n) \times \operatorname{kernel}_{c}(m, n)$
4.输出结果:将所有子区域的计算结果组合成 (H_out,W_out) 的输出张量。
输出:
形状为 (H_out,W_out) 的 2D 数组,其中:
H_out=(H_in+2∗padding−k)//stride+1
W_out=(W_in+2∗padding−K)//stride+1
注: // 代表除法后向下取整

上图为单通道卷积 padding 为 1,stride 为 1 时示意图,多通道卷积时还需对各通道进行求和,题中不再绘制示意图
第一行 C,H_in,W_in 表示输入的张量的通道数、行数与列数;
接下来的 C×H_in 行是此张量的元素值;
接下来一行 C,K_h,K_w 是卷积核的通道数、行数与列数;
接下来 C×H_in是卷积核的元素值;
最后一行是 stride padding
输出卷积后形状为 (H_out,W_out) 的特征图(二维矩阵),元素均为整数。
输入
2 3 3
1 2 3
4 5 6
7 8 9
2 3 4
5 6 7
8 9 10
2 2 2
1 0
0 1
2 0
0 2
1 0
输出
22 28
40 46
说明
第一行 2 3 3 表示输入的张量为 2 通道,每个通道的行数和列数均为 3
第 2−4 行是此张量第一通道的元素值
第 5−7 行是此张量第二通道的元素值
第 8 行的 2 2 2 是卷积核的形状,其通道数与输入张量一致,都是 2 ,行数和列数都是 2
第 9、10 行是此卷积核第 1 通道的元素值
第 11、12 行是此卷积核第 2 通道的元素值
最后一行 2 1 代表卷积操作中卷积窗滑动的步长 stride 为 1 ,padding 为 0
计算过程:
输出尺寸: H_out=13+2×0−2+1=2,W_out=2
输出矩阵位置 (0,0) 的计算过程如下:
通道 1 :窗口 [[1,2],[4,5]]→(1×1)+(2×0)+(4×0)+(5×1)=6
通道 2 :窗口 [[2,3],[5,6]]→(2×2)+(3×0)+(5×0)+(6×2)=4+12=16
各通道求和: 6+16=22
输出矩阵位置 (0,1) 和 (1,0) 元素计算过程略。
位置 (1,1) 计算:
通道 1 :窗口 [[5,6],[8,9]]→(5×1)+(6×0)+(8×0)+(9×1)=14
通道 2 :窗口 [[6,71,[9,10]]→(6×2)+(7×0)+(9×0)+(10×2)=12+20=32
各通道总和: 14+32=46