【问题标题】:How do Convolutional Layers (CNNs) work in keras?卷积层(CNN)如何在 keras 中工作?
【发布时间】:2019-07-10 16:13:18
【问题描述】:

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

它们都具有filterskernel_sizestridespadding 等参数,这些参数在其他keras 层中不存在。

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

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

更改上述参数和Conv 层的尺寸如何影响模型中发生的事情?

【问题讨论】:

    标签: python keras neural-network conv-neural-network


    【解决方案1】:

    卷积 - 与语言无关的基础知识

    要了解卷积在 keras 中的工作方式,我们需要对卷积在与语言无关的设置中的工作方式有基本的了解。

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

    内核和过滤器

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

    直观地说,我们的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我们的输入带有一个零环,这有几个目的:

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

    2. 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/

    【讨论】:

      最近更新 更多