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

4dbbbstv  于 2023-01-05  发布在  其他
关注(0)|答案(4)|浏览(288)

我不明白为什么通道维度不包括在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图层告诉我输出维度为(无、61、61、24)。我使用的内核大小为(8,8),一步(2,2)无填充。值61 =地板((128 - 8 + 2 * 0)/2 + 1)和24(内核/滤波器数量)有意义。**但为什么维度中不包含不同通道的维度?**据我所知,每个通道上24个滤波器的参数都包含在参数数量中。因此,我预计输出维数为(None,61,61,24,3)或(None,61,61,24 * 3)。这只是Keras中一个奇怪的符号,还是我对其他东西感到困惑?

ttvkxqim

ttvkxqim1#

这个问题在互联网上以各种形式被问到,有一个简单的答案,但经常被错过或混淆:
简单回答:Keras Conv2D图层,给定多通道输入(例如彩色图像),将在所有颜色通道上应用滤镜并将结果相加,生成单色卷积输出图像的等效效果。
a CIFAR-10 CNN example中的示例:
(1)您正在使用CIFAR图像数据集进行训练,该数据集由32x32彩色图像组成,即每个图像都是形状(32,32,3)(RGB = 3个通道)
(2)网络的第一个图层是Conv2D图层,其中包含32个过滤器,每个过滤器都指定为3x3,因此:
二维对流(32,(3,3),填充=“相同”,输入形状=(32,32,3))
(3)与直觉相反的是,Keras会将每个滤镜配置为(3,3,3),即覆盖3x3像素加上所有颜色通道的3D体积。作为一个次要细节,每个滤镜都有一个额外的BIAS值权重,这是根据正常的神经网络层算法。
(4)卷积完全按正常方式进行,只是输入图像的3x3x3体积在每一步都与3x3x3滤波器进行卷积,并且在每一步都产生单个(单色)输出值(即像一个像素)。
(5)结果是指定的(3,3)过滤器在(32,32,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

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

pwuypxnk

pwuypxnk2#

每个卷积滤波器(8 x 8)连接到一个(8 x 8)感受野**用于图像的所有通道 *。这就是为什么我们有(61,61,24)作为第二层的输出。不同的声道被隐式地编码到24个滤波器的权重中。这意味着,每个滤波器不具有8 × 8 = 64个权重,而是具有8 × 8 ×信道数= 8 × 8 × 3 = 192个权重。
请参见此quote from CS231

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

mm9b1k5b

mm9b1k5b3#

我猜您误解了卷积层的定义。
卷积层的形状记为(out_channels, in_channels, k, k),其中k是核的大小,out_channels是滤波器(即卷积神经元)的数量,请看下图:

图片中的3d卷积核权重在A_{i-1}的不同数据窗口上滑动形状为(in_channels, k, k)的该图像的3D数据块与匹配维度的各个3d卷积核配对。存在多少个这样的3d核?作为输出通道的数量out_channels。内核采用的深度维度是A_{i-1}in_channels,因此,A_{i-1}的维度in_channels被深度方向的点积收缩,该点积建立了具有out_channels通道的输出Tensor。构造滑动窗口的精确方式由采样元组(kernel_size, stride, padding)定义,并生成空间维度由正确应用的公式确定的输出Tensor。
如果你想了解更多,包括反向传播和实现,看看this论文。

hyrbngr7

hyrbngr74#

您使用的公式是正确的。这可能有点令人困惑,因为许多流行的教程使用的过滤器数量等于图像中的通道数量。TensorFlow/Keras实现通过计算大小为(kernel_size[0], kernel_size[1])num_input_channels * num_output_channels中间特征Map生成其输出。因此,对于每个输入通道,它会生成num_output_channels要素Map,然后将这些Map相乘并连接在一起,以创建(kernel_size[0], kernel_size[1], num_output_channels)的输出形状。希望如此阐明了弗拉德的详细回答

相关问题