卷积 - 与语言无关的基础知识
要了解卷积在 keras 中的工作方式,我们需要对卷积在与语言无关的设置中的工作方式有基本的了解。
卷积层在输入上滑动以构建激活图(也称为特征图)。上面是一个二维卷积的例子。请注意,在每一步中,3 X 3 深色方块如何在输入(蓝色)上滑动,并且对于它分析的输入的每个新的 3 x 3 部分,它在我们的输出激活图中输出一个值(蓝绿色框在最佳)。
内核和过滤器
黑色方块是我们的kernel。 kernel 是一个权重矩阵,与我们输入的每个部分相乘。这些乘法的所有结果放在一起就形成了我们的激活图。
直观地说,我们的kernel 让我们可以重复使用参数——在图像的这一部分中检测到眼睛的权重矩阵将在其他地方检测到它;当一个kernel 可以扫过并在任何地方工作时,为我们输入的每个部分训练不同的参数是没有意义的。我们可以将每个kernel 视为一个特征的特征检测器,它的输出激活图是该特征在输入的每个部分中出现的可能性的图。
kernel 的同义词是 filter。参数filters 要求Conv 层中kernels(特征检测器)的数量。这个数字也将是输出中最后一个维度的大小,即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我们的输入带有一个零环,这有几个目的:
保留边缘信息。从我们的图表中注意到每个角落的白色方块只经过一次卷积,而中心方块经过四次。添加填充可以缓解这个问题 - 原来在边缘的正方形会被卷积更多次。
padding 是一种控制输出形状的方法。我们可以通过保持每个Conv 层的输出与我们的输入具有相同的形状来使形状更易于使用,并且当我们每次使用Conv 层时我们的形状不会变小时,我们可以制作更深的模型。
keras 提供三种不同类型的填充。文档中的解释非常简单,因此在此处复制/解释。这些通过padding=... 传递,即padding="valid"。
valid: 没有填充
same:填充输入,使输出与原始输入具有相同的长度
causal:导致因果关系(dialated convolutions)。通常在上图中,内核的“中心”映射到输出激活图中的值。对于因果卷积,使用的是右边缘。这对于时态数据很有用,您不希望使用未来数据对当前数据进行建模。
Conv1D、Conv2D 和 Conv3D
直观地说,在这些层上发生的操作保持不变。每个kernel 仍然会在您的输入中滑动,每个filter 都会为其自身的功能输出一个激活图,并且padding 仍然会被应用。
区别在于卷积的维数。例如,在Conv1D 中,一维kernel 在一个轴上滑动。在Conv2D 中,一个二维kernel 在两个轴上滑动。
需要注意的是,X-D Conv 层中的 D 并不表示输入的维数,而是表示内核滑过的轴数。
例如,在上图中,即使输入是 3D(具有 RGB 通道的图像),这也是 Conv2D 层的示例。这是因为有两个空间维度 - (rows, cols),并且过滤器仅沿着这两个维度滑动。您可以将其视为在空间维度上是卷积的,在通道维度上是完全连接的。
每个过滤器的输出也是二维的。这是因为每个过滤器都在二维中滑动,从而产生二维输出。因此,您还可以将 N-D Conv 视为每个输出 N-D 向量的过滤器。
您可以使用Conv1D 看到相同的内容(如上图所示)。虽然输入是二维的,但滤波器仅沿一个轴滑动,使其成为一维卷积。
在keras 中,这意味着ConvND 将要求每个样本具有N+1 维度-N 维度以供过滤器滑过,另外还有一个channels 维度。
TLDR - Keras 总结
filters:层中不同kernels的数量。每个kernel 检测并输出特定特征的激活图,使其成为输出形状中的最后一个值。 IE。 Conv1D 输出(batch, steps, filters)。
kernel_size:确定每个kernel/filter/特征检测器的尺寸。还确定有多少输入用于计算输出中的每个值。更大的尺寸 = 检测更复杂的特征,更少的约束;但是它很容易过拟合。
strides: 移动多少个单元来进行下一个卷积。更大的strides = 更多的信息丢失。
padding:"valid"、"causal" 或 "same"。确定是否以及如何用零填充输入。
1D vs 2D vs 3D:表示内核滑过的轴数。 N-D Conv 层将为每个过滤器输出一个N-D 输出,但每个样本都需要一个 N+1 维输入。这是由N 维度到横向加上一个额外的channels 维度组成。
参考资料:
Intuitive understanding of 1D, 2D, and 3D Convolutions in Convolutional Neural Networks
https://keras.io/layers/convolutional/
http://cs231n.github.io/convolutional-networks/