keras中的卷积层(CNNs)是如何工作的?

7
我注意到在keras文档中有许多不同类型的Conv层,例如Conv1D、Conv2D、Conv3D。它们所有都有filters、kernel_size、strides和padding等参数,这些参数在其他keras层中不存在。
我看到过像这样的图像来“可视化”Conv层,

enter image description here

但我不理解从一层到下一层的转换是如何进行的。 改变上述参数和我们的Conv层的尺寸将如何影响模型中发生的事情?
1个回答

16

卷积 - 通用基础知识

为了理解keras中的卷积是如何工作的,我们需要对在通用设置下卷积是如何工作有一个基本的了解。

enter image description here

卷积层通过滑动输入来构建激活图(也称为特征图)。以上是2D卷积的示例。请注意,在每个步骤中,3 x 3的黑色正方形在输入(蓝色)上滑动,并且对于输入的每个新的3 x 3部分进行分析,它会在我们的输出激活图中输出一个值(顶部的蓝绿色框)。
核和过滤器
黑色正方形是我们的内核。内核是一个权重矩阵,与我们输入的每个部分相乘。所有这些乘法的结果组合在一起形成我们的激活图。
直观地说,我们的内核让我们重复使用参数-在图像的这一部分检测到眼睛的权重矩阵将用于在其他地方检测它;没有必要为输入的每个部分训练不同的参数,当一个内核可以扫过并在任何地方工作时。我们可以将每个内核视为一个特征探测器,其输出激活图为该特征在输入的每个部分中存在的可能性的映射。
{{卷积核}}的同义词是{{过滤器}}。参数{{过滤器数目}}要求在该{{卷积层}}中有多少个{{卷积核}}(特征检测器)。这个数字也将是输出的最后一个维度的大小,即{{过滤器数目=10}}将导致输出形状为{{(???, 10)}}。这是因为每个{{卷积层}}的输出都是一组激活图,而会有{{过滤器数目}}个激活图。
{{卷积核大小}}
{{卷积核大小}}指的是每个{{卷积核}}的大小。我们之前讨论过,每个{{卷积核}}都由一个加权矩阵组成,该矩阵被调整以更好地检测某些特征。{{卷积核大小}}决定了过滤器掩模的大小。换句话说,在每次卷积期间处理多少“输入”。例如,上面的图表每次处理一个3 x 3的输入块。因此,它的{{卷积核大小}}为{{(3, 3)}}。我们还可以称上述操作为“3x3卷积”。
较大的{{卷积核大小}}几乎没有限制其表示的特征,而较小的{{卷积核大小}}则限制于特定的低级特征。但请注意,多个小{{卷积核大小}}层可以模拟较大{{卷积核大小}}的效果。
{{步长}}
注意我们上面的kernel每次都会移动两个单位。在每次计算中,kernel“移动”的数量称为strides,因此在keras中,我们的strides=2。一般来说,随着我们增加strides的数量,我们的模型从一个层到另一个层失去的信息越多,因为激活映射具有“间隙”。
填充
回到上面的图表,注意我们输入周围的白色正方形环。这是我们的padding。没有padding,每次我们通过Conv层传递输入时,结果的形状变得越来越小。因此,我们用一圈零来填充输入,这起到了几个目的:
1. 保留边缘周围的信息。从我们的图表中可以看出,每个角落的白色正方形只经过一次卷积,而中央的正方形经过四次卷积。添加填充可以减轻这个问题-最初在边缘的正方形会被卷积更多次。 2. padding是控制输出形状的一种方法。通过使每个Conv层的输出与我们的输入具有相同的形状,我们可以使形状更易于处理,并且当我们使用Conv层时,如果形状不会变小,则可以制作更深层次的模型。

Keras提供了三种不同类型的填充方式。文档中的解释非常直观,因此在这里进行复制/改写。这些可以使用padding=...传递,例如padding="valid"

valid:不填充

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

causal:导致因果(扩张卷积)。通常,在上图中,内核的“中心”映射到输出激活图中的值。使用因果卷积时,使用右侧边缘。这对于时间数据非常有用,您不想使用未来数据来模拟现在的数据。

Conv1D、Conv2D和Conv3D

直观地说,这些层上发生的操作仍然相同。每个kernel仍然滑过您的输入,每个filter为其自身的特征输出一个激活图,并且仍然应用padding

区别在于卷积的维数。例如,在Conv1D中,一维kernel沿一个轴滑动。在Conv2D中,二维kernel沿两个轴滑动。

非常重要的是,在X-D Conv层中,D并不表示输入的维数,而是内核滑过的轴数

enter image description here

例如,在上图中,即使输入是3D(具有RGB通道的图像),这也是Conv2D层的示例。这是因为有两个空间维度-(行,列),而滤波器仅沿这两个维度滑动。您可以将其视为在空间维度上进行卷积,在通道维度上进行完全连接。
每个过滤器的输出也是二维的。这是因为每个过滤器在两个维度上滑动,创建一个二维输出。因此,您还可以将N-D Conv视为每个过滤器输出N-D向量。

enter image description here

你可以在Conv1D(如上图所示)中看到相同的情况。虽然输入是二维的,但滤波器只沿一个轴滑动,使其成为一维卷积。
keras中,这意味着ConvND将要求每个样本具有N+1个维度-N个维度用于滤波器滑动,另外一个channels维度。 TLDR-Keras总结 filters:层中不同kernels的数量。每个kernel检测并输出特定功能的激活映射,从而成为输出形状中的最后一个值。即Conv1D输出(batch, steps, filters)kernel_size:确定每个kernel/filter/特征检测器的维度。还确定用于计算输出中每个值的输入量。较大的大小=检测更复杂的特征,约束较少;但容易过拟合。 strides:您移动多少个单位以进行下一次卷积。较大的步幅=更多信息丢失。 padding:可以是"valid""causal""same"。确定是否以及如何使用零填充输入。

1D vs 2D vs 3D: 表示卷积核滑动的轴数。一个N-D Conv层将为每个滤波器输出一个N-D输出,但对于每个样本,将需要一个N+1维度的输入。这由要横跨的N个维度加上一个额外的channels维度组成。

参考资料:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接