我不明白为什么通道维度不包含在 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 层告诉我输出维度是 (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 中的一个奇怪符号,还是我对其他事情感到困惑?
原文由 MachineLearner 发布,翻译遵循 CC BY-SA 4.0 许可协议
这个问题在互联网上以各种形式被问到,并且有一个经常被遗漏或混淆的简单答案:
简单答案:给定多通道输入(例如彩色图像)的 Keras Conv2D 层将在所有颜色通道上应用过滤器并对结果求和,产生等效于单色卷积输出图像。
一个来自 CIFAR-10 CNN 示例的示例:
(1) 您正在使用 CIFAR 图像数据集进行训练,该数据集由 32x32 彩色 图像组成,即每个图像的形状为 (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 滤波器进行卷积,并且在每一步产生单个(单色)输出值(即像像素)。
(5) 结果是指定的(3,3)滤波器在(32,32,3)图像上的Keras Conv2D卷积产生(32,32)结果,因为实际使用的滤波器是(3,3,3) .
(6) 在本例中,我们还在 Conv2D 层中指定了 32 个过滤器,因此每个输入图像的实际输出为 (32,32,32)(即您可能认为这是 32 个图像,每个过滤器一个,每个 32x32 单色像素)。
作为检查,您可以查看 model.summary() 生成的层的权重计数(Param #):
有 32 个过滤器,每个 3x3x3(即 27 个权重)加上 1 个偏差(即每个总共 28 个权重)。 32 个过滤器 x 28 个权重,每个 = 896 个参数。