Keras层文档指定卷积层的输入和输出大小: https://keras.io/layers/convolutional/
输入形状:(samples, channels, rows, cols)
输出形状:(samples, filters, new_rows, new_cols)
内核大小是一个空间参数,即仅确定宽度和高度。
因此,无论c
的值如何,使用filters
频道的输入都会产生c
个频道的输出。因此,它必须将2D卷积应用于空间height x width
过滤器,然后以某种方式为每个学习过滤器聚合结果。
这个聚合运算符是什么?它是跨渠道的总结吗?我能控制它吗?我找不到关于Keras文档的任何信息。
感谢。
答案 0 :(得分:19)
可能令人困惑的是,它被称为 Conv2D 层(这对我而言,这就是为什么我来寻找这个答案),因为正如Nilesh Birari评论的那样:
我猜你错过了它的3D内核[宽度,高度,深度]。因此,结果是跨渠道的总和。
也许 2D 源于内核只有幻灯片沿着两个维度,第三维度是固定的并由输入通道的数量决定(输入深度) )。
有关更详细的说明,请阅读https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/
我从那里摘了一个说明性的图片:答案 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
我还设置了卷积以具有以下属性:
我们希望(汇总)输出为:
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()