理解卷积神经网络(CNN)中的通道、输入形状和输出形状

3
我尝试跟随这个教程: 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文档:
输出形状: 形状为(batch, filters, new_rows, new_cols)的4D张量
这似乎意味着输出形状将是32x148x148,我的问题是这种理解是否正确? 如果是这样,那么额外的过滤器来自哪里?
1个回答

8
如果输入形状为(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。以下事情会发生:

enter image description here

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

图片来自这篇博客文章


谢谢。我的问题的一部分是,3通道图像如何获得32个通道(或滤波器)的输出。我明白更新宽度、高度和批量大小的重点。 - clwen
@clwen,你将过滤器设置为32,这意味着对于每个图像,它会生成32个特征映射或通道。 - Amir
感谢您编辑这个图示。在这种情况下,我们得到了32份完全相同的148x148副本吗?因为我们没有为这32个过滤器中的每一个指定不同的偏置/内核。 - clwen
1
当你使用 filters=32 和 kernel_size=(3,3) 时,你正在创建 32 个不同的过滤器,每个过滤器的长度为 (3,3)。结果将带来 32 种不同的卷积。默认情况下,偏差为零。 - Amir
1
我明白了。有一个kernel_initializer。如果我们没有传递任何参数,那么内核仍会使用默认的随机初始化方法进行初始化。(根据文档,其默认值为glorot_uniform) - clwen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接