卷积层(CNN)如何在 keras 中工作?
Posted
技术标签:
【中文标题】卷积层(CNN)如何在 keras 中工作?【英文标题】:How do Convolutional Layers (CNNs) work in keras? 【发布时间】:2019-07-10 16:13:18 【问题描述】:我注意到在keras
文档中有许多不同类型的Conv
层,即Conv1D
、Conv2D
、Conv3D
。
它们都具有filters
、kernel_size
、strides
和padding
等参数,这些参数在其他keras
层中不存在。
我见过像这样“可视化”Conv
层的图像,
但我不明白从一层过渡到下一层的过程中发生了什么。
更改上述参数和Conv
层的尺寸如何影响模型中发生的事情?
【问题讨论】:
【参考方案1】:卷积 - 与语言无关的基础知识
要了解卷积在 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/
【讨论】:
以上是关于卷积层(CNN)如何在 keras 中工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过预先训练的InceptionV3加速我的Keras CNN