Keras Conv2D和输入频道

时间:2017-04-09 11:46:45

标签: python keras

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

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

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

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

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

这个聚合运算符是什么?它是跨渠道的总结吗?我能控制它吗?我找不到关于Keras文档的任何信息。

感谢。

2 个答案:

答案 0 :(得分:19)

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

  

我猜你错过了它的3D内核[宽度,高度,深度]。因此,结果是跨渠道的总和。

也许 2D 源于内核只有幻灯片沿着两个维度,第三维度是固定的并由输入通道的数量决定(输入深度) )。

有关更详细的说明,请阅读https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/

我从那里摘了一个说明性的图片:

kernel depth

答案 1 :(得分:2)

我还需要说服自己,所以我用一个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

enter image description here

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

  • 没有填充
  • 步幅= 1
  • 激活激活功能
  • 偏差初始化为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)

运行摘要以获取参数数量:

model.summary()

enter image description here