Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.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 理解keras中conv2d层的输出形状_Python_Keras_Conv Neural Network - Fatal编程技术网

Python 理解keras中conv2d层的输出形状

Python 理解keras中conv2d层的输出形状,python,keras,conv-neural-network,Python,Keras,Conv Neural Network,我不明白为什么通道尺寸不包括在Keras中conv2D层的输出尺寸中 我有下面的型号 def create_model(): image = Input(shape=(128,128,3)) x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_1')(image) x = Conv2D(24, kernel_size=(8,8), strides=(2,2), ac

我不明白为什么通道尺寸不包括在Keras中conv2D层的输出尺寸中

我有下面的型号

def create_model():
    image = Input(shape=(128,128,3))

    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_1')(image)
    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_2')(x)
    x = Conv2D(24, kernel_size=(8,8), strides=(2,2), activation='relu', name='conv_3')(x)
    flatten = Flatten(name='flatten')(x)

    output = Dense(1, activation='relu', name='output')(flatten)
    model = Model(input=image, output=output)
    return model

model = create_model()
model.summary()
我的问题末尾给出了模型摘要。输入层获取宽度为128、高度为128的RGB图像。第一个conv2D层告诉我输出维度是(None,61,61,24)。我使用的内核大小是(8,8),跨步是(2,2),没有填充。值61=floor((128-8+2*0)/2+1)和24(内核/过滤器的数量)是有意义的但是为什么不同通道的尺寸没有包含在尺寸中?据我所知,每个通道上24个过滤器的参数都包含在参数的数量中所以我希望输出维度是(None,61,61,24,3)或(None,61,61,24*3)。这只是Keras中一个奇怪的符号,还是我对其他东西感到困惑?


我猜你误解了卷积层的定义

我对卷积层的形状的表示法是
(out\u channels,in\u channels,k,k)
,其中
k
是内核的大小。
out\u通道
是滤波器的数量(即卷积神经元)。考虑以下图像:

图片中的三维卷积核权重在
A_{i-1}
(即输入图像)的不同数据窗口中滑动。形状
(在_通道中,k,k)
的图像的3D数据块与匹配维度的单个3D卷积核配对。有多少这样的3d内核?作为输出通道数
输出通道数
。内核采用的深度维度是
A{i-1}
通道中的
。因此,
A{i-1}
in_通道
维度被深度方向的点积收缩,该点积与
out_通道
通道建立输出张量。滑动窗口的精确构造方式由采样元组(
kernel\u size,stride,padding)
定义,并产生输出张量,其空间维度由正确应用的公式确定


如果您想了解更多信息,包括反向传播和实现,请参阅本文。

您使用的公式是正确的。这可能有点令人困惑,因为许多流行教程使用的过滤器数量等于图像中通道的数量。TensorFlow/Keras实现通过计算
num\u input\u channels*num\u output\u channels
大小
的中间特征映射(kernel\u size[0],kernel\u size[1])
。因此,对于每个输入通道,它产生
num\u output\u channels
特征映射,然后将其相乘并连接在一起,以创建
的输出形状(内核大小[0],内核大小[1],num\u output\u channels)
希望这澄清Vlad的详细答案每个卷积滤波器(8 x 8)都连接到一个(8 x 8)图像所有通道的感受野。这就是为什么我们有(61,61,24)作为第二层的输出。不同的信道隐式编码到24个滤波器的权重中。这意味着,每个过滤器没有8 x 8=64个权重,而是8 x 8 x通道数=8 x 8 x 3=192个权重

看到这个了吗

左:红色输入音量示例(例如32x32x3 CIFAR-10图像), 以及第一卷积层神经元的示例体积。 卷积层中的每个神经元仅与局部神经元相连 在空间上输入体积中的区域,但达到整个深度(即全部 颜色通道)。注意,有多个神经元(本例中为5个) 沿深度,所有人都在输入中查看同一区域-请参见 在下文中讨论深度列。右:来自大脑的神经元 神经网络章节保持不变:他们仍然计算一个点 其重量与输入的乘积,然后是非线性, 但它们的连通性现在仅限于局部空间


这个问题在互联网上以各种形式被问到,答案很简单,但经常被遗漏或混淆:

简单回答: 给定多通道输入(例如彩色图像),Keras Conv2D层将在所有彩色通道上应用滤波器,并对结果进行求和,产生相当于单色卷积输出图像的结果

例如,来自:

(1) 您正在使用CIFAR图像数据集进行训练,该数据集由32x32彩色图像组成,即每个图像都是形状(32,32,3)(RGB=3个通道)

(2) 网络的第一层是Conv2D层,包含32个过滤器,每个过滤器指定为3x3,因此:

Conv2D(32,(3,3),padding='same',input_shape=(32,32,3))

(3) 与直觉相反,Keras将每个过滤器配置为(3,3,3),即覆盖3x3像素和所有颜色通道的3D体积。作为次要细节,根据正常的神经网络层算法,每个滤波器都有一个偏差值的附加权重

(4) 卷积过程与正常过程完全相同,除了输入图像的3x3x3体积在每一步用3x3x3滤波器卷积,并且在每一步产生单个(单色)输出值(即,像像素一样)

(5) 结果是(32,32,3)图像上指定(3,3)滤波器的Keras Conv2D卷积产生(32,32)结果,因为实际使用的滤波器是(3,3,3)

(6) 在本例中,我们还在Conv2D层中指定了32个过滤器,因此每个输入图像的实际输出为(32,32,32)(即,您可能认为这是32个图像,每个过滤器一个,每个32x32单色像素)

作为检查,您可以查看model.summary()生成的层的权重计数(Param#):

那儿
Layer (type)         Output shape       Param#
conv2d_1 (Conv2D)   (None, 32, 32, 32)  896