了解keras中的conv2d层的输出形状

时间:2019-03-31 18:32:18

标签: 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), 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()

模型摘要在我的问题结尾处显示。输入层拍摄的RGB图像的宽度为128,高度为128。第一个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中的一个奇怪的说法,还是我对其他事情感到困惑?

enter image description here

4 个答案:

答案 0 :(得分:2)

这个问题在互联网上以各种形式提出,并且有一个简单的答案,通常会被遗漏或混淆:

简单答案: 给定多通道输入(例如彩色图像)的Keras Conv2D层将在所有颜色通道上应用滤镜,并对结果求和,产生与单色卷积输出图像等效的结果。

来自the keras.io website cifar CNN example的示例:

(1)您正在使用CIFAR图像数据集进行训练,该数据集由32x32 color 图像组成,即每个图像都是形状(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体积。按照常规神经网络层算法,每个过滤器的次要细节都具有BIAS值的额外权重。

(4)绝对按照正常方式进行卷积,只是在每个步骤中使用3x3x3滤波器对来自输入图像的3x3x3 VOLUME进行卷积,并在每个步骤中生成单个(单色)输出值(即像素)。

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

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

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

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

共有32个滤镜,每个滤镜3x3x3(即27个权重)加上1个偏差(即每个滤镜总共28个权重)。还有32个过滤器x 28个权重= 896个参数。

答案 1 :(得分:0)

我的猜测是您误解了卷积层的定义方式。

我对卷积层形状的表示法是(out_channels, in_channels, k, k),其中k是内核的大小。 out_channels是过滤器(即卷积神经元)的数量。考虑以下图片:

Convolution illustration

图片中的3d卷积核权重跨A_{i-1}(即输入图像)的不同数据窗口滑动。形状为(in_channels, k, k)的该图像的3D数据补丁与匹配维数的各个3d卷积核配对。有多少个这样的3d内核?输出通道数out_channels。内核采用的深度维度是in_channels的{​​{1}}。因此,A_{i-1}的尺寸in_channels被深度点积缩小,该深度积通过A_{i-1}通道构建输出张量。构造滑动窗口的精确方法由采样元组(out_channels定义,并导致输出张量具有由正确应用的公式确定的空间尺寸。

如果您想了解更多信息,包括反向传播和实现,请查看this论文。

答案 2 :(得分:0)

您使用的公式正确。可能会有点混乱,因为许多流行的教程使用的过滤器数量等于图像中的通道数量。 TensorFlow / Keras实现通过计算大小为num_input_channels * num_output_channels的{​​{1}}中间特征图来产生其输出。因此,对于每个输入通道,它会产生(kernel_size[0], kernel_size[1])个特征图,然后将它们相乘并连接在一起以创建num_output_channels的输出形状,希望这可以弄清Vlad的详细答案

答案 3 :(得分:0)

每个卷积滤波器(8 x 8)连接到(8 x 8)图像的所有通道的接收场 。这就是为什么我们将(61,61,24)作为第二层的输出。不同的通道被隐式编码为24个滤波器的权重。这意味着,每个过滤器没有8 x 8 = 64权重,而是8 x 8 x通道数= 8 x 8 x 3 = 192权重。

查看此quote from CS231 enter image description here

  

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