深度学习中什么是卷积, 它是如何工作的

1、数学物理层面

数学上,连续卷积的定义如下:

(f g)(t) = ∫[f(τ) g(t - τ)] dτ

其中, 表示卷积操作,f(t) 和 g(t) 是两个函数,(f g)(t) 是它们的卷积结果。

它的物理含义可以理解为:系统某一时刻的输出是由多个输入共同作用(叠加)的结果。

具体解释如下:

假设有两个物理量(例如信号,场或系统响应等),可用公式中的函数f(t) 和 g(t)表示。在物理上,卷积大概可以理解为:系统某一时刻的输出是由多个输入共同作用(叠加)的结果。

g(t) 是系统的响应函数(或滤波器)。它描述了系统对输入信号 f(t) 的响应方式。g(t) 中的每一个值表示了在时间 t 时,系统对输入信号的加权响应。

在卷积过程中,我们考虑了 f(t) 中的每个时间点 τ,并将其与 g(t - τ) 相乘。这相当于在时间轴上对 g(t - τ) 进行了平移,然后与 f(t) 相乘。这个过程捕捉了在不同时间点上,系统响应函数 g(t) 对输入信号 f(t) 的影响。

最后,通过对所有时间点的乘积进行积分,我们将所有加权的响应值进行累加。这就得到了在每个时间点 t 上的卷积结果 (f * g)(t)。该结果描述了输入信号 f(t) 通过系统响应函数 g(t) 后的响应情况。

因此,卷积公式提供了一种描述系统响应、信号传播和叠加效应的数学工具。它在物理学中被广泛应用,例如信号处理、系统响应分析、场的传播和滤波器设计等领域。

2、图像层面

在深度学习中,卷积层是神经网络中一种常用的操作,它使用卷积运算对输入数据进行特征提取。卷积层的数学公式可以通过以下方式解释:

假设输入数据是一个三维张量,具有形状为 [H, W, C],其中 H 表示高度,W 表示宽度,C 表示通道数。卷积层使用一组称为卷积核(或过滤器)的权重来对输入进行卷积操作。

假设卷积核的形状为 [FH, FW, C, K],其中 FH 和 FW 表示卷积核的高度和宽度,C 表示输入的通道数,K 表示卷积核的数量(也称为输出通道数)。一般而言,在图像领域,卷积核的高度和宽度相等,常见的设置有3x3、5x5、7x7等。

卷积操作的数学公式可以表示为:

输出特征图的某个位置的数值 = sum(输入特征图的对应位置 * 卷积核的权重) + 偏置

具体而言,对于输出特征图的每个位置 (i, j, k),其中 i 表示高度索引,j 表示宽度索引,k 表示通道索引,卷积操作可以表示为:

输出特征图[i, j, k] = sum(sum(sum(输入特征图[m, n, c] * 卷积核[m, n, c, k]))) + 偏置[k]

其中,m 和 n 表示卷积核的高度和宽度索引,c 表示输入特征图的通道索引。

这个公式说明了卷积操作的过程。在每个位置 (i, j, k),输入特征图与卷积核的对应位置进行逐元素相乘,然后将所有乘积相加。这相当于对输入特征图的局部区域与卷积核进行加权叠加,得到输出特征图的对应位置。

最后,可以通过添加偏置项来调整输出特征图的整体偏移量。偏置项在公式中表示为偏置[k],其中 k 表示输出通道索引。

下面是一个大小为3x3的卷积核,步长为1的二维卷积示意图:

image

可以看到3x3的卷积核以滑动窗口的形式在输入通道上滑动,并通过某种计算得到上面的输出值,每一个卷积核在一个位置会得到一个输出值,按照卷积核的移动顺序形成的输出矩阵。这是最直观的卷积形式。

具体计算的过程如下所示:

image

卷积核在原始输入矩阵所覆盖区域对应元素相乘然后相加。

对于一个图片而言,一般的图片是三通道图片,即包含RGB三个通道,对一个图片的卷积计算,它是如何完成的呢?

image

具体计算过程解释如下:

首先将三通道图片切分成三个单通道,这里标记为B、G、R三个通道。B、G、R三个通道分别与对应的卷积核进行卷积计算,然后再通过偏置叠加在一起。这个就得到了三通道图片的卷积。

3、卷积中的参数

以一个3x3卷积核为例,该卷积核中有9个参数,那么这9个参数是怎么来的呢?卷积核的个数又是什么呢?

其实卷积核中有9个参数也是作为超参数通过模型训练得到的,一个训练好的卷积核可以更好的提取图像的特征。

常见的初始化方法可以为恺明初始化。

如下是pytorch中搭建模型时常用的初始化方式:

1
2
3
4
5
6
7
def _initialize_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")
elif isinstance(m, nn.Linear):
nn.init.normal(m.weight, 0, 0.01)
nn.init.constant_(m.bias, 0)

对单通道的图片卷积过程,卷积核的个数,其实就是卷积之后输出通道的个数。而对于三通道的卷积过程,卷积核的个数等于输出通道数*输入通道数。