理解卷积神经网络中的卷积滤波操作
卷积滤波器,亦称卷积核,旨在探测输入数据中的特定模式或特征。以图像处理为例,滤波器或许被设计来识别边缘、角落或纹理。在深度学习领域,这些滤波器的权重通过在大规模数据集上的训练而自动习得。
图1展示了卷积操作的原理。我们有一个形状为(1,5,5)的输入矩阵,这可以是一个非常小的黑白图像。图像的像素值即为特征,因为每个像素值代表了特定位置的光强度。为了检测图像中的物体、面部等,我们需要学习这些特征之间的关系。为此,我们应用卷积核,即小的权重矩阵,在本例中大小为(3,3),对输入进行处理。我们从左上角开始,对重叠的输入部分和卷积核执行点积运算。在本例中:9 * 0 + 4 * 2 + 1 * 1 + 1 * 4 + 1 * 1 + 1 * 0 + 1 * 1 + 2 * 0 + 1 * 1 = 16。现在,我们已经完成了第一个3x3像素值的计算,我们将卷积核向右移动一格并重新开始,得到值30。我们重复整个操作,直到卷积核覆盖了输入图像的每一个像素。
输出矩阵被称为特征图。特征图并不能直接被人解读,但它们作为网络捕捉和编码输入数据中特定特征存在的一种方式。随着网络在训练过程中从数据中学习,它会调整其滤波器以识别与手头任务相关的特征,例如对图像中的物体进行分类。
对彩色RGB图像进行卷积操作
彩色RGB格式的图像具有形状(宽度,高度,颜色通道),有时也会以不同的顺序表示:(颜色通道,宽度,高度)。因此,输入图像现在包含三个颜色矩阵。以下部分将解释在RGB图像情况下如何进行卷积核操作。
假设我们在一个5x5像素的彩色输入图像上应用一个卷积层,该卷积层包含2个大小为(3,3)的滤波器。由于输入图像是RGB格式,其形状为(3,5,5),其中“3”代表三个颜色通道(红、绿、蓝),而“5,5”代表图像的宽度和高度。
上述插图展示了将两个滤波器/卷积核应用于一张图像的过程,最终生成了两个特征图。首先,每个滤波器会为每个输入通道初始化一个随机权重矩阵。在我们的例子中,输入图像有三个输入通道(红色、绿色、蓝色),因此每个滤波器都包含三个权重矩阵。在操作过程中,每个滤波器的三个权重矩阵分别应用于对应的三个颜色通道,从而生成三个新的3×3大小的矩阵,称为特征图。每个特征图的新尺寸是通过以下公式计算得出的:
这三个特征图现在以逐元素的方式相加,从而生成第一个滤波器的单一特征图。由于我们初始化了第二个滤波器,同样的过程会重复进行,但这次使用不同的权重。这种组合增强了网络识别复杂模式的能力,这些复杂模式可能涉及不同颜色通道之间的相互作用。每个特征图都突出了模式、边缘或纹理。每个滤波器的权重是通过反向传播学习得到的。
#Same Opertion in Pytorch:
nn.Conv2d(input_channels=3, output_channels=2, kernel_size=3, stride=1, padding=0)
为了更清晰地说明,我们举一个带有随机数字的例子。
有时,当我们创建一个二维卷积层时,很难理解 PyTorch 代码的具体操作。下图展示了三种不同的 nn.Conv2d 配置及其对应的特征图结果。在所有三种情况下,输入图像都是相同的 5×5 RGB 图像,其维度为 (3, 5, 5)。第一个配置展示了使用步长(stride)为 2 的效果,这使得特征图变小。图中的编号灰色和黑色方块说明了卷积核的移动路径,在这个例子中是从位置 1 移动到位置 2。当然,之后卷积核会继续向下移动两行。在右侧,我们看到了输出的特征图。计算结果展示了特征图的预期尺寸,在这个例子中是 2。这里的 2 代表特征图的高度和宽度,因此输出特征图的尺寸为 2×2。
第二种 PyTorch 的 nn.Conv2d 配置使用了 2 个输出通道,从而生成了两个特征图。在这个例子中,我们希望卷积核在移动时没有任何重叠。然而,如果输入图像的尺寸是 5×5,而卷积核的尺寸是 3×3,步长为 3,那么会出现错误,因为预期的特征图尺寸为 ⌊3(5−3)⌋+1=1.66。这是不可能的,因为特征图的尺寸必须是整数。因此,为了使这种配置能够实现,我们需要添加填充(padding)。在这种情况下,填充的大小需要为 2,因为填充为 1 仍然无法解决问题。
理解数据的前向传播过程
让我们通过以下各层来说明数据在 PyTorch 或 TensorFlow 中的流动过程。
-
卷积层(2个卷积核,卷积核尺寸为3,ReLU激活函数)
-
-
下图展示了尺寸为(5,5)的黑白输入图像的像素值如何通过这些层进行变换。最初,两个卷积核的权重矩阵(以蓝色表示)被随机初始化,并应用于输入图像。这产生了两个尺寸均为(3,3)的特征图。随后,最大池化层将特征图的尺寸缩小为(2,2)的矩阵。最后,Dropout层以指定的概率随机将每个值设为零。在此例中,Dropout率为50%。为了继续进行全连接层的操作,我们需要将这些矩阵展平并进行拼接。
理解卷积层的感受野 对于较大的输入,我们需要很多层才能理解整个输入。我们可以通过使用步长(stride)、卷积核大小(kernel_size)和最大池化(max_pooling)来对特征进行下采样。这些操作会增加感受野。感受野本质上表达了后续层包含的关于输入层最初信息的多少。考虑一个长度为7的一维数组的例子,我们在其上应用一个大小为3的一维卷积核。在左侧我们可以看到,由于卷积操作,第二层的一维数组长度从7减少到5。第二层的第一个单元现在代表了第一层最初3个单元的信息。
另一个用于展示感受野的示例:
-- END --
关注“
学姐带你玩AI
”公众号,
回复“
CNN创新
”
领取7大类CNN创新方案合集+开源代码