1. 首页
  2. 技术文章

卷积层的工作示例

卷积层的工作示例

 

Keras深度学习库提供了一组卷积层。

通过查看一些使用人工数据和手工过滤器的示例,我们可以更好地理解卷积操作。

在本节中,我们将同时看一维卷积层和二维卷积层示例,以使卷积运算具体化并提供使用Keras层的工作示例。

一维卷积层的示例

我们可以定义一维输入,该输入具有八个元素,所有元素的值均为0.0,中间有两个元素的凸点,值为1.0。

对于一维卷积层,到Keras的输入必须是三维的。

第一维是指每个输入样本;第二维是指每个输入样本。在这种情况下,我们只有一个样本。第二维是指每个样本的长度;第二维是指每个样本的长度。在这种情况下,长度为八。第三维是指每个样本中的通道数。在这种情况下,我们只有一个频道。

因此,输入数组的形状将为[1、8、1]。

我们将定义一个模型,期望输入样本的形状为[8,1]。

该模型将具有形状为3或三个元素宽的单个过滤器。Keras将过滤器的形状称为kernel_size

默认情况下,卷积层中的过滤器使用随机权重初始化。在这个人为的示例中,我们将手动指定单个过滤器的权重。正如我们在输入示例中定义的那样,我们将定义一个能够检测颠簸的滤波器,该滤波器是一个高输入值,而低输入值包围了该输入值。

我们将定义的三元素过滤器如下所示:

卷积层还具有偏置输入值,该偏置输入值也需要权重,我们将其设置为零。

因此,我们可以强制一维卷积层的权重使用我们的手工滤波器,如下所示:

必须按照行,列和通道的三维结构指定权重。该过滤器具有单行,三列和一个通道。

我们可以检索权重并确认其设置正确。

最后,我们可以将单个过滤器应用于我们的输入数据。

我们可以通过在模型上调用predict()函数来实现。这将直接返回特征图:这是在输入序列中系统应用过滤器的输出。

将所有这些结合在一起,下面列出了完整的示例。

运行示例首先显示网络的权重。这证实了我们在模型中设置了我们手工制作的滤镜,正如我们所期望的那样。

接下来,将滤镜应用于输入模式,然后计算并显示特征图。从特征图的值可以看到正确检测到了凹凸

让我们仔细看看这里发生了什么。

回想一下,输入是一个八元素向量,其值是:[0,0,0,1,1,1,0,0,0]。

首先,通过计算点积(“。”运算符),将三元素滤波器[0,1,0]应用于输入[0,0,0]的前三个输入,这将得到一个输出值在零要素图中。

回想点积是元素乘积的总和,或者在这里是(0 x 0)+(1 x 0)+(0 x 0)=0。在NumPy中,可以手动实现为:

在我们的手动示例中,如下所示:

然后将过滤器沿输入序列的一个元素移动,并重复此过程;具体来说,将相同的滤波器应用于索引1、2和3的输入序列,这也会导致特征图中的输出为零

我们正在系统化,所以再次使过滤器沿着输入的另一个元素移动,并在索引2、3和4处将其应用于输入。这一次,输出在特征图中为1的值。我们检测到该功能并已适当激活。

重复该过程,直到我们计算出整个特征图为止。

注意,特征图有六个元素,而我们的输入有八个元素。这是如何将滤波器应用于输入序列的伪像。还有其他方法可以将过滤器应用于输入序列,以更改生成的特征图的形状,例如填充,但我们将不在本文中讨论这些方法。

您可以想象,使用不同的输入,我们可能会以或多或少的强度检测特征,并在过滤器中使用不同的权重,从而检测到输入序列中的不同特征。

卷积层的工作示例

二维卷积层的示例

我们可以将上一节中的碰撞检测示例扩展为二维图像中的垂直线检测器。

同样,我们可以将输入限制为带有单个通道(例如灰度)且中间有一条垂直线的正方形8×8像素输入图像。

Conv2D层的输入必须是四维的。

第一维定义样本;第二维定义样本。在这种情况下,只有一个样本。第二个维度定义行数;第二个维度定义行数。在这种情况下,八个。第三维定义列数,在这种情况下再次为八,最后定义通道数,在这种情况下为一。

因此,在这种情况下,输入必须具有四维形状[样本,行,列,通道]或[1、8、8、1]

我们将使用上一个Conv1D示例中的示例,用单个过滤器定义Conv2D。

过滤器将是二维的且正方形的,形状为3×3。该层将期望输入样本具有[列,行,通道]或[8,8,1]的形状

我们将定义一个垂直线检测器过滤器,以检测输入数据中的单个垂直线。

过滤器如下所示

我们可以这样实现

最后,我们将滤镜应用于输入图像,这将生成一个特征图,我们希望该特征图显示对输入图像中垂直线的检测。

特征图输出的形状将为四维,其形状为[批,行,列,过滤器]。我们将执行一个批处理,并且有一个过滤器(一个过滤器和一个输入通道),因此输出形状为[1,?,?,1]。我们可以如下打印漂亮的单要素地图内容:

将所有这些结合在一起,下面列出了完整的示例。

首先运行示例,确认手工制作的滤镜已在图层权重中正确定义

接下来,打印计算出的特征图。从数字的比例中可以看出,过滤器确实在特征图的中间检测到了一条具有强烈激活作用的垂直线。

让我们仔细看看计算的结果。

首先,将滤镜应用于图像的左上角或3×3元素的图像块。从技术上讲,图像块是具有单个通道的三维,并且滤镜具有相同的尺寸。我们不能使用dot()函数在NumPy中实现此功能,相反,必须使用tensordot()函数,以便我们可以对所有维度进行适当的求和,例如:

该计算导致单个输出值为0.0,例如未检测到特征。这为我们提供了要素地图左上角的第一个元素。

手动将如下所示:

过滤器沿一列向左移动,然后重复该过程。同样,未检测到该功能。

向左再移动到下一列,则首次检测到该功能,从而激活了该功能。

重复此过程,直到滤镜的边缘靠在输入图像的边缘或最后一列上为止。这给出了特征图的第一完整行中的最后一个元素。

过滤器然后向下移动一行并返回第一列,并且该过程从左到右相关以给出特征图的第二行。然后继续,直到过滤器的底部停留在输入图像的底部或最后一行。

再次,与上一节一样,我们可以看到特征图是6×6的矩阵,比8×8的输入图像小,这是因为滤镜如何应用于输入图像的限制。

 

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code