Keras Conv2D 和输入通道

Posted

技术标签:

【中文标题】Keras Conv2D 和输入通道【英文标题】:Keras Conv2D and input channels 【发布时间】:2017-09-04 12:04:15 【问题描述】:

Keras 层文档指定了卷积层的输入和输出大小: https://keras.io/layers/convolutional/

输入形状:(samples, channels, rows, cols)

输出形状:(samples, filters, new_rows, new_cols)

并且内核大小是一个空间参数,即仅确定宽度和高度。

因此,无论c 的值如何,带有c 通道的输入都会产生带有filters 通道的输出。因此,它必须应用带有空间height x width 过滤器的二维卷积,然后以某种方式为每个学习的过滤器聚合结果。

这个聚合运算符是什么?它是跨渠道的总和吗?我可以控制它吗?我在 Keras 文档中找不到任何信息。

请注意,在 TensorFlow 中,过滤器也在深度通道中指定: https://www.tensorflow.org/api_guides/python/nn#Convolution, 这样深度操作就很清楚了。

谢谢。

【问题讨论】:

你需要阅读this。 来自此页面:“在输出体积中,第 d 个深度切片(大小为 W2×H2)是对输入体积执行第 d 个过滤器的有效卷积的结果一个 SS 的步幅,然后被第 d 个偏差抵消。”。所以我仍然不了解这些带有 2D 内核的体积卷积如何变成 2D 结果。深度维度是通过求和降低的吗? "示例1.例如,假设输入体积的大小为[32x32x3],(例如RGB CIFAR-10图像)。如果感受野(或过滤器大小)为5x5,则Conv 层中的每个神经元将具有输入体积中 [5x5x3] 区域的权重,总共 5*5*3 = 75 个权重(和 +1 个偏置参数)。请注意,沿深度的连接程度轴必须是 3,因为这是输入体积的深度。” - 我猜你错过了它的 3D 内核 [宽度、高度、深度]。所以结果是跨渠道求和。 @Nilesh Birari ,我的问题是如何知道 Keras 在做什么。我猜是总和,但我怎么能确定呢? 【参考方案1】:

它被称为 Conv2D 层可能会令人困惑(对我来说,这就是我来寻找这个答案的原因),因为正如 Nilesh Birari 评论的那样:

我猜你错过了它的 3D 内核 [宽度、高度、深度]。所以结果是跨渠道求和。

也许2D源于内核只沿二维滑动,第三维是固定的,由输入通道的数量(输入深度)。

如需更详细的解释,请阅读https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/

我从那里提取了一张说明性图片:

【讨论】:

那么过滤器的每个通道都有自己可以优化的权重吗?还是我们只是计算一个通道的权重并将其用作过滤器其余通道的值。 所有通道的内核都不同。看我的回答。 我认为不同的内核仅用于说明。在 Keras 中,它可以跨渠道使用相同的内核实现。【参考方案2】:

我也想知道这一点,并找到了另一个答案here,其中有说明(强调我的):

也许多通道输入最明显的例子是当您有一个具有 3 个 RGB 通道的彩色图像时。让我们把它放到一个有 3 个输入通道和 1 个输出通道的卷积层。 (...) 它的作用是计算每个滤波器与其相应输入通道的卷积 (...)。所有通道的步幅相同,因此它们输出的矩阵大小相同。现在,它将所有矩阵相加并输出一个矩阵,该矩阵是卷积层输出的唯一通道

插图:

请注意,每个通道的卷积核的权重是不同的,然后在反向传播步骤中通过例如基于梯度体面的算法,例如随机梯度下降 (SDG)。

这是来自TensorFlow API 的更技术性的回答。

【讨论】:

【参考方案3】:

我还需要说服自己,所以我运行了一个带有 3×3 RGB 图像的简单示例。

# red    # green        # blue
1 1 1    100 100 100    10000 10000 10000
1 1 1    100 100 100    10000 10000 10000    
1 1 1    100 100 100    10000 10000 10000

过滤器被初始化为1:

1 1
1 1

我还将卷积设置为具有以下属性:

无填充 步幅 = 1 relu 激活函数 偏置初始化为 0

我们希望(聚合的)输出是:

40404 40404
40404 40404

另外,从上图中,没有。参数是

3 个单独的过滤器(每个通道一个)×4 权重 + 1(偏差,未显示)= 13 个参数


这是代码。

导入模块:

import numpy as np
from keras.layers import Input, Conv2D
from keras.models import Model

创建红色、绿色和蓝色通道:

red   = np.array([1]*9).reshape((3,3))
green = np.array([100]*9).reshape((3,3))
blue  = np.array([10000]*9).reshape((3,3))

堆叠通道以形成 RGB 图像:

img = np.stack([red, green, blue], axis=-1)
img = np.expand_dims(img, axis=0)

创建一个只进行 Conv2D 卷积的模型:

inputs = Input((3,3,3))
conv = Conv2D(filters=1, 
              strides=1, 
              padding='valid', 
              activation='relu',
              kernel_size=2, 
              kernel_initializer='ones', 
              bias_initializer='zeros', )(inputs)
model = Model(inputs,conv)

在模型中输入图片:

model.predict(img)
# array([[[[40404.],
#          [40404.]],

#         [[40404.],
#          [40404.]]]], dtype=float32)

运行一个summary得到参数个数:

model.summary()

【讨论】:

优秀的贡献 这是一个很好的答案。老实说,我认为 conv2d 这个名字非常令人困惑。 所以,我不是唯一一个开始想知道那里实际发生了什么以及底层聚合是什么样子的人?

以上是关于Keras Conv2D 和输入通道的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Conv2D 层中使用 keras 指定填充?

Keras Conv2D:过滤器与 kernel_size

Keras - 将 3 通道图像输入 LSTM

深度学习入门,Keras Conv2D类参数详解

如何确定 Keras Conv2D 函数中的“过滤器”参数

我不明白 conv1d、conv2d 的 pytorch 输入大小