卷积层 (CNN) 在 keras 中如何工作?

Pri*_*usa 2 python neural-network conv-neural-network keras

我注意到在keras文档中有许多不同类型的Conv层,即Conv1D, Conv2D, Conv3D.

它们都具有其他层中不存在的参数,例如filterskernel_sizestrides和。paddingkeras

我见过像这样“可视化”Conv图层的图像,

在此处输入图片说明

但我不明白从一层过渡到下一层的过程中发生了什么。

改变上述参数和我们Conv层的维度如何影响模型中发生的事情?

Pri*_*usa 8

卷积 - 语言不可知基础

要了解卷积在 keras 中的工作原理,我们需要对卷积在与语言无关的环境中的工作原理有一个基本的了解。

在此处输入图片说明

卷积层在输入上滑动以构建激活图(也称为特征图)。上面是一个二维卷积的例子。请注意,在每一步,3 X 3 暗方块如何滑过输入(蓝色),并且对于它分析的输入的每个新 3 x 3 部分,它会在我们的输出激活图中输出一个值(位于最佳)。

内核和过滤器

黑色方块是我们的kernel。该kernel是乘以我们输入的每个部分的权重矩阵。这些乘法的所有结果放在一起形成了我们的激活图。

直观地说,我们kernel让我们重用参数——在图像的这一部分检测眼睛的权重矩阵将在其他地方检测它;当我们kernel可以扫描并在任何地方工作时,为我们输入的每一部分训练不同的参数是没有意义的。我们可以将每个kernel视为一个特征的特征检测器,它的输出激活图作为该特征在输入的每个部分中出现的可能性的图。

的同义词kernelfilter。该参数filters要求kernelsConv层中(特征检测器)的数量。这个数字也将是输出中最后一个维度的大小,即filters=10会导致输出形状为(???, 10). 这是因为每Conv一层的输出是一组激活图,并且会有filters多个激活图。

内核大小

kernel_size是很好,每个内核的大小。我们之前讨论过,每个都kernel包含一个权重矩阵,该矩阵经过调整以越来越好地检测某些特征。kernel_size决定过滤面罩的大小。在英语中,每次卷积过程中处理了多少“输入”。例如,我们的上图每次处理输入的 3 x 3 块。因此,它具有kernel_size(3, 3)。我们也可以将上述操作称为“3x3 卷积”

较大的内核大小几乎不受它们所代表的特征的约束,而较小的内核则仅限于特定的低级特征。请注意,多层小内核大小可以模拟较大内核大小的效果。

大步

注意我们上面的kernel每次移动两个单位。kernel每次计算的“移位”量称为strides,可以keras说我们的strides=2. 一般来说,随着我们增加 的数量strides,我们的模型从一层到下一层会丢失更多的信息,因为激活图有“间隙”。

填充

回到上图,注意我们输入周围的白色方块环。这是我们的padding. 在没有填充的情况下,每次我们将输入通过一个Conv层时,结果的形状就会变得越来越小。因此,我们pad的输入带有一圈零,这有几个目的:

  1. 保留边缘信息。从我们的图中注意每个角的白色方块如何只经过一次卷积,而中心方块经过四次。添加填充可以缓解这个问题 - 边缘上的方块会被更多次卷积。

  2. padding是一种控制输出形状的方法。我们可以通过保持每Conv一层的输出与我们的输入具有相同的形状来使形状更容易使用,并且当我们每次使用一个Conv层时我们的形状不会变小,我们可以制作更深的模型。

keras提供三种不同类型的填充。文档中的解释非常简单,因此在此处复制/释义。这些是通过padding=...,即padding="valid"

valid: 没有填充

same: 填充输入,使输出与原始输入具有相同的长度

causal:导致因果关系(拨号卷积)。通常在上图中,内核的“中心”映射到输出激活图中的值。对于因果卷积,使用右边缘代替。这对于时态数据很有用,您不希望使用未来数据对当前数据进行建模。

Conv1D、Conv2D 和 Conv3D

直观上,发生在这些层上的操作保持不变。每个kernel仍然在您的输入上滑动,每个filter输出一个针对其自己特征的激活图,并且padding仍然应用。

不同之处在于卷积的维数。例如,在Conv1D一维kernel滑动中穿过一个轴。在Conv2D2D 中kernel跨两个轴滑动。

需要注意的是,XD Conv 层中的 D 并不表示输入的维数,而是内核滑过的轴数

在此处输入图片说明

例如,在上图中,即使输入是 3D(具有 RGB 通道的图像),这也是Conv2D层的示例。这是因为有两个空间维度 - (rows, cols),并且过滤器仅沿这两个维度滑动。您可以将其视为空间维度上的卷积和通道维度上的完全连接。

每个过滤器的输出也是二维的。这是因为每个过滤器在二维中滑动,创建二维输出。因此,您还可以将 NDConv视为输出 ND 矢量的每个过滤器。

在此处输入图片说明

你可以看到同样的事情Conv1D(如上图所示)。虽然输入是二维的,但滤波器仅沿一个轴滑动,使其成为一维卷积。

在 中keras,这意味着ConvND需要每个样本都具有N+1维度 -N过滤器滑动的channels维度和一个额外的维度。

TLDR - Keras 总结

filters:kernels层数不同。每个kernel检测并输出特定特征的激活图,使其成为输出形状中的最后一个值。即Conv1D输出(batch, steps, filters)

kernel_size:确定每个的尺寸kernel/ filter/特征检测器。还确定有多少输入用于计算输出中的每个值。更大的尺寸 = 检测更复杂的特征,更少的约束;但是它容易过拟合。

strides: 移动多少个单位进行下一次卷积。更大strides=更多的信息丢失。

padding: "valid", "causal", 或"same"。确定是否以及如何用零填充输入。

1D vs 2D vs 3D:表示内核滑过的轴数。NDConv层将为N-D每个过滤器输出一个输出,但每个样本需要 N+1 维输入。这是从N维度到横向加上一个附加channels维度组成的。

参考:

直观理解卷积神经网络中的 1D、2D 和 3D 卷积

https://keras.io/layers/convolutional/

http://cs231n.github.io/convolutional-networks/