【问题标题】:Understanding Channel in Convolution Neural Network (CNN) input shape and output shape了解卷积神经网络 (CNN) 输入形状和输出形状中的通道
【发布时间】:2019-01-08 19:22:15
【问题描述】:

我试图按照本教程进行操作 https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

在基线模型中,它具有 model.add(Conv2D(32, (3, 3), input_shape=(3, 150, 150)))

我不太了解这里的输出形状。如果输入形状为 3x150x150,内核大小为 3x3,那么输出形状不是 3x148x148 吗? (假设没有填充)。但是,根据 Keras Doc:

输出形状:4D 张量,形状:(batch, filters, new_rows, new_cols)

在我看来,输出形状将是 32x148x148。我的问题是这种理解是否正确?如果是这样,额外的过滤器是从哪里来的?

【问题讨论】:

    标签: keras neural-network conv-neural-network


    【解决方案1】:

    如果输入形状为(3, 150, 150),则应用Conv2D层后输出为(?, 32, 148, 148)。看看下面的例子:

    inps = Input(shape=(3, 150, 150))
    conv = Conv2D(32, (3, 3), data_format='channels_first')(inps)
    print(conv)
    >> Tensor("conv2d/BiasAdd:0", shape=(?, 32, 148, 148), dtype=float32)
    
    • ?符号指定的第一个维度是批量大小。
    • 第二个维度是过滤器大小 (32)。
    • 最后两个是图片宽度和高度 (148)。

    通道如何从 3 变为 32? 假设我们有 RGB 图像(3 个通道)并且输出通道大小为 1。会发生以下情况:

    当您使用 filters=32kernel_size=(3,3) 时,您将创建 32 个不同的过滤器,每个过滤器的形状为 (3,3,3)。结果会带来32个不同的卷积。请注意,根据Keras,所有内核在开头都由glorot_uniform初始化。

    图片来自blog post

    【讨论】:

    • 谢谢。我的部分问题是 3 通道图像如何获得 32 通道(或过滤器)的输出。我得到了更新宽度和高度以及批量大小的点。
    • @clwen 您将过滤器设置为 32,这意味着它为每个图像生成 32 个特征图或通道。
    • 感谢您使用图进行编辑。在这种情况下,我们得到 32 个相同的 148x148 副本?因为我们没有为 32 个过滤器中的每一个指定不同的偏差/内核。
    • 当您使用 filters=32 和 kernel_size=(3,3) 时,您将创建 32 个不同的过滤器,每个过滤器的长度为 (3,3)。结果会带来32个不同的卷积。默认情况下,偏差为零。
    • 我明白了。有一个 kernel_initializer。如果我们不传递任何东西,内核仍然会随机初始化为默认值。 (根据文档默认为 glorot_uniform)
    猜你喜欢
    • 2020-05-26
    • 2017-07-30
    • 2017-08-31
    • 2018-01-24
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2020-12-28
    相关资源
    最近更新 更多