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

时间:2019-02-16 21:00:04

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

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

所有参数都具有filterskernel_sizestridespadding之类的参数,这些参数在其他keras层中不存在。

我看过这样的图像,它们“可视化” Conv层,

enter image description here

但是我不明白从一层到下一层的过渡过程。

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

1 个答案:

答案 0 :(得分:3)

卷积-语言不可知的基础

要了解卷积如何在喀拉拉邦工作,我们需要对卷积如何在语言不可知的环境中进行基本了解。

enter image description here

卷积层在输入上滑动以构建激活图(也称为要素图)。以上是2D卷积的示例。请注意,在每个步骤中,3 X 3深色正方形如何在输入上滑动(蓝色),并针对其分析的输入的每个新3 x 3部分,在输出激活图中输出一个值(最佳)。

内核和过滤器

黑色方块是我们的kernelkernel是权重矩阵,乘以我们输入的每个部分。这些乘法运算的所有结果加在一起构成了我们的激活图。

直观地讲,我们的kernel使我们可以重用参数-在图像的此部分中检测到眼睛的权重矩阵将在其他位置检测到它;当kernel可以遍及所有地方工作时,为输入的每个部分训练不同的参数毫无意义。我们可以将每个kernel视为一个功能的功能检测器,并将其输出激活图作为该功能在输入的每个部分中出现的可能性的图。

kernel的同义词是filter。参数filters要求该kernels层中的Conv(特征检测器)数量。此数字也将是输出中最后一个尺寸的大小,即filters=10将导致输出形状为(???, 10)。这是因为每个Conv层的输出是一组激活图,并且将有filters个激活图。

内核大小

kernel_size很好,每个内核的大小。前面我们讨论过,每个kernel都由一个权重矩阵组成,该矩阵经过调整可以更好地检测某些特征。 kernel_size决定了滤镜的大小。用英语,在每个卷积过程中要处理多少“输入” 。例如,我们上面的图表每次处理3 x 3的输入块。因此,它具有kernel_size的{​​{1}}。我们也可以将上述操作称为“ 3x3卷积”

较大的内核大小几乎不受它们表示的功能的约束,而较小的内核则限于特定的低级功能。但是请注意,较小内核大小的多层可以模拟较大内核大小的效果。

大步

请注意我们上面的(3, 3)每次如何移动两个单位。 kernel每次计算的“移位”量称为kernel,因此在strides中说我们的keras。一般来说,随着strides=2数量的增加,由于激活图具有“空白”,我们的模型会从一层到另一层丢失更多信息。

填充

回到上图,请注意输入周围的白色正方形环。这是我们的strides。不使用填充,每次我们将输入通过padding层时,结果的形状就会越来越小。结果,我们Conv的输入带有零环,这有几个用途:

  1. 保留边缘信息。从我们的图表中注意到,每个角白色正方形仅经历一次卷积,而中心正方形经历了四次。添加填充可缓解此问题-最初位于边缘的正方形会卷积更多次。

  2. pad是一种控制输出形状的方法。通过使每个padding层的输出具有与输入相同的形状,可以使形状更易于使用,并且当每次使用{{1 }}层。

Conv提供了三种不同类型的填充。文档中的解释非常简单,因此可以在此处进行复制/解释。这些通过Conv传递,即keras

padding=...:无填充

padding="valid":对输入进行填充,以使输出具有与原始输入相同的长度

valid:导致因果关系(径向卷积)。通常,在上图中,内核的“中心”映射到输出激活映射中的值。因果卷积使用右边缘代替。这对于临时数据非常有用,在临时数据中您不想使用将来的数据来对当前数据建模。

Conv1D,Conv2D和Conv3D

直观地讲,这些层上发生的操作保持不变。每个same仍会在您的输入中滑动,每个causal会为其自身的功能输出激活图,并且kernel仍会应用。

差异是卷积的维数。例如,在filter中,一维padding沿一个轴滑动。在Conv1D中,二维kernel在两个轴上滑动。

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

enter image description here

例如,在上图中,即使输入是3D(具有RGB通道的图像),这也是Conv2D图层的示例。这是因为存在两个空间维度-kernel,并且过滤器仅沿这两个维度滑动。您可以认为这在空间维度上是卷积的,在通道维度上是完全连接的。

每个过滤器的输出也是二维的。这是因为每个过滤器都在二维中滑动,从而创建了二维输出。结果,您还可以将N-D Conv2D视为每个输出N-D向量的滤波器。

enter image description here

使用(rows, cols)可以看到相同的内容(如上图所示)。当输入为二维时,过滤器仅沿一个轴滑动,从而使其成为一维卷积。

Conv中,这意味着Conv1D将要求每个样本都具有keras尺寸-ConvND尺寸,以便过滤器可以滑过,另外还有一个{{1} }维度。

TLDR-Keras总结

N+1:图层中不同N的数量。每个channels都会检测并输出特定功能的激活图,使其成为输出形状中的最后一个值。即filters输出kernels

kernel:确定每个Conv1D / (batch, steps, filters) /功能检测器的尺寸。还确定要使用多少输入来计算输出中的每个值。更大的尺寸=检测更复杂的特征,更少的约束;但是它很容易过拟合。

kernel_size:要进行下一次卷积需要移动多少个单位。 kernel越大=丢失的信息越多。

filterstridesstridespadding。确定是否以及如何用零填充输入。

"valid":表示内核滑动的轴数。一个N-D "causal"层将为每个滤波器输​​出一个"same"输出,但是每个样本都需要一个N + 1维输入。这是由1D vs 2D vs 3D到另一边的尺寸以及另外一个Conv尺寸组成的。

参考文献:

Intuitive understanding of 1D, 2D, and 3D Convolutions in Convolutional Neural Networks

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

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