当前位置: 首页 > 知识库问答 >
问题:

理解keras中conv2d层的输出形状

邢硕
2023-03-14

我不明白为什么通道维度不包含在Keras中con2D层的输出维度中。

我有以下型号

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=下限((128-8 2 x 0)/2 1)和24(内核/过滤器的数量)是有意义的。但为什么维度中不包括不同通道的维度?据我所知,每个通道上24个滤波器的参数都包含在参数数量中。所以我希望输出维度是(None,61,61,24,3)或(None,61,61,24*3)。这只是Keras中一个奇怪的符号,还是我对其他东西感到困惑?

共有3个答案

师冥夜
2023-03-14

我的猜测是您误解了卷积层是如何定义的。

我对卷积层形状的表示法是(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通道构建输出张量。构建滑动窗口的精确方式由采样元组(kernel_size、步幅、填充)定义,并产生空间维度由正确应用的公式确定的输出张量。

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

东门仲卿
2023-03-14

每个卷积滤波器(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个),所有神经元都注视着输入中的同一区域-请参阅下文中深度列的讨论。右图:神经网络一章中的神经元保持不变:它们仍然计算其权重与输入的点积,然后是非线性,但它们的连接性现在仅限于局部空间。

贾兴学
2023-03-14

这个问题在互联网上以各种形式被问到,并且有一个经常被错过或混淆的简单答案:

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

一个来自keras的例子。io网站cifar CNN示例:

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

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

Conv2D(32,(3,3),填充='相同',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个单色像素)。

作为检查,您可以查看模型生成的层的权重计数(Param#)。摘要():

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

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

 类似资料:
  • 我正在开发一个程序,该程序用一个无方向的Conv2D层(跨距=1)替换跨距的Conv2D层(跨距=2),然后在激活层之后添加一个AveragePooling2D层(跨距=2)。换句话说,AveragePooling2D层将减少输出维度,而不是让Conv2D层减少输出维度。 我使用本文中描述的方法将Conv2D层替换为非结构化版本,并在激活后插入averagepoolig2d层。替换Conv2D层效

  • 第一个Conv2D层中的输入形状应该是(100, 100, 1)但是输出是(无,98, 98, 200)。我知道200和无决定了什么,但我不确定98是参数。此外,除此之外,我随机选择了200个作为Conv2D模型的过滤器数量。我应该如何确定适合我的模型的过滤器数量。是基于试错吗?请帮忙。谢谢!! (100, 100, 1)模式:sequential_3 conv2d_5(conv2d)(无,98,

  • 在模型中添加LSTM层之前,我不确定是否需要添加密集输入层。例如,使用以下模型: LSTM层是否为输入层,密集层是否为输出层(即无隐藏层)?或者Keras是否创建了一个输入层,这意味着LSTM层将是一个隐藏层?

  • 我在Keras建立了一个卷积神经网络。 根据CS231讲座,卷积操作为每个过滤器创建一个特征映射(即激活映射),然后将其堆叠在一起。在我的例子中,卷积层有一个300维的输入。因此,我预计会进行以下计算: 每个过滤器的窗口大小为5。因此,每个滤波器产生300-5 1=296个卷积 但是,实际输出形状看起来不同: 偏移值的形状很有意义,因为每个过滤器都有一个偏移值。然而,我不了解重量的形状。显然,第一

  • 我对Keras中的和感到困惑。他们之间有什么区别?我认为第一个是一个层,第二个是一个后端函数,但这意味着什么?在Conv2D中,我们发送过滤器的数量、过滤器的大小和跨步(但是在Conv2D中,我们使用内核是什么(64,3,3),我们把过滤器的数量和大小放在一起?我应该在哪里输入内核数?你能帮我解决这个问题吗?非常感谢。 pytorch中的代码 Keras中已更改的代码 但当我执行代码时,它会产生以

  • 问题内容: 我正在尝试构建LSTM模型,以解决https://keras.io/layers/recurrent/中的文档示例 以下三行代码(加上注释)直接来自上面的文档链接: ValueError:输入0与层lstm_2不兼容:预期ndim = 3,找到的ndim = 2 在执行第二个model.add()语句之后,但在将模型暴露给我的数据甚至编译它之前,我在上面得到了该错误。 我在这里做错了什