CNN 中 "二维卷积" 做的是二维卷积还是三维卷积?

结论: CNN 中的 "二维卷积" (注意在本文中加了引号表示的是 CNN 中的概念) 做的实际上是: 1) 三维卷积和张量拼接; 或者 2) 二维卷积, 矩阵和及张量拼接. 所以严格意义上, 把 CNN 中的 "二维卷积" 说成二维卷积或三维卷积都是不全面的. 但个人认为, 说 "二维卷积" 的主要运算是二维卷积或者三维卷积都是没问题的, 不过后者似乎更接近本质.

先做一些符号约定:

1) "二维卷积" 的输入特征图 $X$ 的尺寸设为 (batch_size, in_channels, input_height, input_width), 简记为 $(N, C_{in}, X_H, X_W)$, 每个样本的输入特征图记为 $X_i$, 其尺寸为 $(C_{in}, X_H, X_W)$, 其中 $i = 1, 2, \cdots, N$.

2) "二维卷积" 的卷积核 $K$ 的尺寸设为 (out_channels, in_channels, kernel_height, kernel_width), 简记为 $(C_{out}, C_{in}, K_H, K_W)$, 每个滤波器记为 $K_i$, 其尺寸为 $(C_{in}, K_H, K_W)$, 其中 $i = 1, 2, \cdots, C_{out}$.

3) "二维卷积" 的输出特征图 $Y$ 的尺寸设为 (batch_size, out_channels, output_height, output_width), 简记为 $(N, C_{out}, Y_H, Y_W)$.

我们来看 $X$ 和 $K$ 的 "二维卷积" 是如何得到 $Y$ 的:

1) 对于 $X_i$, 计算 $Y_{i,j} = K_j * X_i$, 其中 $*$ 表示卷积运算, 由于 $K_j$ 和 $X_i$ 都是三维的, 所以该卷积运算应为 三维离散卷积 运算. 由于 $K_j$ 的第一维尺寸等于 $X_i$ 的第一维尺寸, $X_i$ 在第一维上没有填充 (填充尺寸为 0), 且第一维上的卷积也没有设置步长 (步长为 1), 所以 $Y_{i,j}$ 的尺寸是 $(1, Y_H, Y_W)$. $Y_{i,j}$ 的第一维尺寸为 1, 不妨 squeeze 掉, 这样 $Y_{i,j}$ 的尺寸变为 $(Y_H, Y_W)$.

$Y_{i,j}$ 的一个等效定义是 $Y_{i,j} = \sum_{k=1}^{C_{in}} K_{j,k} * X_{i,k}$, 其中 $*$ 表示 二维离散卷积 运算, $K_{j,k}$ 表示 $K_{j}$ 的第 $k$ plane, 尺寸为 $(K_H, K_W)$, $X_{i,k}$ 表示 $X_{i}$ 的第 $k$ plane, 尺寸为 $(X_H, X_W)$, 最终 $Y_{i,j}$ 的尺寸是 $(Y_H, Y_W)$. 该等效定义将三维卷积转化为了二维卷积及矩阵和运算.

如果 "二维卷积" 包含偏置项 $b_j$, 则 $Y_{i,j} = K_j * X_i + b_jI$, 其中 $I$ 是尺寸为 $(Y_H, Y_W)$ 的全 1 矩阵.

2) $Y_{i,j}$, $\forall j \in \{1, 2, \cdots, C_{out}\}$ 在第一维上 stack, 得到 $Y_{i}$, 其尺寸为 $(C_{out}, Y_H, Y_W)$. 在一些 DL 框架 (如 Caffe) 中, 通过对 $X_i$ 和 $K$ 进行某种变换可以将 1)2) 转化为矩阵乘运算.

3) $Y_{i}$, $\forall i \in \{1, 2, \cdots, N\}$ 在第一维上 stack, 得到 $Y$, 其尺寸为 $(N, C_{out}, Y_H, Y_W)$.

综上, CNN 中的 "二维卷积", 实际上包含了数学意义上的: 三维卷积及张量拼接运算 (当 "二维卷积" 不含偏置项时; 如果含偏置项, 则还要加上矩阵和运算); 或者: 二维卷积, 矩阵和及张量拼接运算.

PS: 在大多数 DL 框架中实现的实际是 互相关 (cross-correlation) 操作, 而不是 卷积, 两者在某种意义上是等效的, 这里没做严格区分.

参考

更新记录

  • 20211023, 发布

版权声明

自由转载-非商用-非衍生-保持署名 (创意共享3.0许可证)

版权归属: 采石工
本文链接: https://quarryman.cn/article/20211023
版权声明: 除特别声明外, 文章采用《署名-非商业性使用-相同方式共享 4.0 国际》许可协议.