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

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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我们的输入带有一个零环,这有几个目的:

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

    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/

【讨论】:

以上是关于卷积层(CNN)如何在 keras 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过预先训练的InceptionV3加速我的Keras CNN

如何在keras中可视化卷积神经网络中间层的输出?

如何使用 Keras 将一维输入提供给卷积神经网络(CNN)?

在预测期间,数据规范化如何在 keras 中工作?

Keras CNN模型参数计算

python model.trainable = False如何在keras中工作(GAN模型)