我不明白为什么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()
模型摘要在我的问题结尾处显示。输入层拍摄的RGB图像的宽度为128,高度为128。第一个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中的一个奇怪的说法,还是我对其他事情感到困惑?
答案 0 :(得分:2)
这个问题在互联网上以各种形式提出,并且有一个简单的答案,通常会被遗漏或混淆:
简单答案: 给定多通道输入(例如彩色图像)的Keras Conv2D层将在所有颜色通道上应用滤镜,并对结果求和,产生与单色卷积输出图像等效的结果。
来自the keras.io website cifar CNN example的示例:
(1)您正在使用CIFAR图像数据集进行训练,该数据集由32x32 color 图像组成,即每个图像都是形状(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 VOLUME进行卷积,并在每个步骤中生成单个(单色)输出值(即像素)。
(5)结果是在(32,32,3)图像上指定(3,3)滤镜的Keras Conv2D卷积产生(32,32)结果,因为使用的实际滤镜为(3,3 ,3)。
(6)在此示例中,我们还在Conv2D层中指定了32个滤镜,因此每个输入图像的实际输出为(32,32,32)(即,您可能认为这是32个图像,其中一个用于每个滤镜,每个32x32单色像素)。
作为检查,您可以查看model.summary()生成的图层的权重计数(参数#):
Layer (type) Output shape Param#
conv2d_1 (Conv2D) (None, 32, 32, 32) 896
共有32个滤镜,每个滤镜3x3x3(即27个权重)加上1个偏差(即每个滤镜总共28个权重)。还有32个过滤器x 28个权重= 896个参数。
答案 1 :(得分:0)
我的猜测是您误解了卷积层的定义方式。
我对卷积层形状的表示法是(out_channels, in_channels, k, k)
,其中k
是内核的大小。 out_channels
是过滤器(即卷积神经元)的数量。考虑以下图片:
图片中的3d卷积核权重跨A_{i-1}
(即输入图像)的不同数据窗口滑动。形状为(in_channels, k, k)
的该图像的3D数据补丁与匹配维数的各个3d卷积核配对。有多少个这样的3d内核?输出通道数out_channels
。内核采用的深度维度是in_channels
的{{1}}。因此,A_{i-1}
的尺寸in_channels
被深度点积缩小,该深度积通过A_{i-1}
通道构建输出张量。构造滑动窗口的精确方法由采样元组(out_channels
定义,并导致输出张量具有由正确应用的公式确定的空间尺寸。
如果您想了解更多信息,包括反向传播和实现,请查看this论文。
答案 2 :(得分:0)
您使用的公式正确。可能会有点混乱,因为许多流行的教程使用的过滤器数量等于图像中的通道数量。 TensorFlow / Keras实现通过计算大小为num_input_channels * num_output_channels
的{{1}}中间特征图来产生其输出。因此,对于每个输入通道,它会产生(kernel_size[0], kernel_size[1])
个特征图,然后将它们相乘并连接在一起以创建num_output_channels
的输出形状,希望这可以弄清Vlad的详细答案
答案 3 :(得分:0)
每个卷积滤波器(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个) 沿着深度,所有输入都看在同一区域中-请参见 下文中对深度列的讨论。右:来自 神经网络一章保持不变:它们仍然计算点 它们的权重与输入的乘积,然后是非线性, 但是它们的连通性现在仅限于局部空间。