Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 卷积层(CNN)如何在KERA中工作?_Python_Keras_Neural Network_Conv Neural Network - Fatal编程技术网

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

Python 卷积层(CNN)如何在KERA中工作?,python,keras,neural-network,conv-neural-network,Python,Keras,Neural Network,Conv Neural Network,我注意到在keras文档中有许多不同类型的Conv层,即Conv1D,Conv2D,Conv3D 它们都有一些参数,如过滤器,内核大小,步幅,以及填充,这些参数在其他keras层中不存在 我见过这样的图像,它们“可视化”了Conv层 但我不明白在从一层到下一层的过渡过程中发生了什么 更改上述参数和我们的Conv层的维度如何影响模型中发生的事情?卷积-语言不可知基础 为了理解在keras中卷积是如何工作的,我们需要基本了解卷积在语言不可知的环境中是如何工作的 卷积层在输入上滑动以构建激活映射(

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

它们都有一些参数,如
过滤器
内核大小
步幅
,以及
填充
,这些参数在其他
keras
层中不存在

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

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


更改上述参数和我们的
Conv
层的维度如何影响模型中发生的事情?

卷积-语言不可知基础

为了理解在keras中卷积是如何工作的,我们需要基本了解卷积在语言不可知的环境中是如何工作的

卷积层在输入上滑动以构建激活映射(也称为特征映射)。上面是2D卷积的一个示例。请注意,在每一步中,3 X 3的深色方块是如何在输入(蓝色)上滑动的,对于它分析的输入的每一个新的3 X 3部分,它会在我们的输出激活图中输出一个值(顶部的蓝绿色框)

内核和过滤器

暗方是我们的
内核
内核
是一个权重矩阵,它与输入的每个部分相乘。所有这些乘法的结果一起构成了我们的激活图

直观地说,我们的
内核
允许我们重用参数——在图像的这一部分检测眼睛的权重矩阵将用于在其他地方检测眼睛;当一个
内核可以横扫并在任何地方工作时,为输入的每个部分训练不同的参数是没有意义的。我们可以将每一个<代码>内核<代码>作为一个特征的特征检测器,并且它是输出激活映射,作为该特征在输入的每个部分中存在的可能性的映射。
kernel
的同义词是
filter
。参数
filters
询问
Conv
层中的
内核数
(特征检测器)。此数字也将是输出中最后一个维度的大小,即
过滤器=10
将导致输出形状为
(?,10)
。这是因为每个
Conv
层的输出是一组激活映射,并且将有
过滤器
数量的激活映射

内核大小

kernel\u size
是每个内核的大小。我们在前面讨论过,每个
内核
都由一个权重矩阵组成,该矩阵经过调整以更好地检测某些特征<代码>内核大小
指定过滤器掩码的大小。在英语中,每次卷积过程中处理多少“输入”。例如,我们上面的图表每次处理一个3x3的输入块。因此,它的
内核大小为
(3,3)
。我们也可以将上述操作称为“3x3卷积”

较大的内核大小在它们所表示的特性中几乎不受限制,而较小的内核大小仅限于特定的低级特性。但是请注意,多个小内核大小的层可以模拟较大内核大小的效果

跨步

注意上面的
内核每次移动两个单位。每次计算的
内核
“移位”量称为
步长
,因此在
keras
中,我们的
步长=2
。一般来说,随着
步数的增加
,我们的模型从一层到下一层丢失了更多的信息,因为激活图有“间隙”

填充

回到上图,注意我们输入的周围有一圈白色的正方形。这是我们的
填充
。没有填充,每次我们通过
Conv
层传递输入时,结果的形状就会越来越小。因此,我们
pad
用一个零环填充我们的输入,这有几个用途:

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

  • 填充
    是控制输出形状的一种方法。通过保持每个
    Conv
    层的输出与输入的形状相同,我们可以使形状更易于使用,并且当我们使用
    Conv
    层时形状不会变小时,我们可以制作更深的模型

  • keras
    提供三种不同类型的填充。文件中的解释非常简单,因此在此处复制/解释。它们是通过
    padding=…
    传入的,即
    padding=“valid”

    有效
    :无填充

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

    因果
    :导致因果(拨号卷积)。通常在上图中,内核的“中心”映射到输出激活映射中的值。对于因果卷积,使用右边缘代替。这对于时态数据很有用,因为您不想使用未来数据来建模当前数据

    Conv1D、Conv2D和Conv3D

    直观上,这些层上发生的操作保持不变。每个
    内核
    仍然在您的输入中滑动,每个
    过滤器
    输出其自身功能的激活映射,并且仍然应用
    填充

    差异是卷积的维度数。例如在
    Conv1D
    a中