根据我的理解,2D-Convolution将N个滤镜应用于输入图像,产生N个新的“图像”(=特征图)。
如果我们忽略步幅/子采样,在使用N个通道的2D卷积后,32x32图像变为Nx32x32张量:
但是,在Keras中,32x32输入产生32xN输出。所以,我的问题是,如何应用降维?这一步是否涉及另一个隐藏层?
如果是这样,网络是否会失去查看图像的能力 - 即2D实体?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~
此代码可以重现我的上述说法:
inputs = Input(shape=(1, 32, 32,))
shared = Convolution2D(nb_filter=10, nb_row=8, nb_col=8, subsample=(1, 1), border_mode='same', activation='relu')(inputs)
print("1 => ", inputs.shape)
print("2 => ", shared.shape)
它生成 - 因为我们将10个滤镜(== N)应用于32x32灰度图像
1 => (?,1,32,32)
2 => (?,1,32,10)
在哪里?是未指定的批量大小,1是输入通道的数量(RGB为3,灰度为1)。
输入的形状为32x32,如预期的那样。 但是,卷积的输出具有32xN维度而不是32x32xN
答案 0 :(得分:2)
可能是因为输入格式顺序。
来自Keras docs Conv2D采用此参数
data_format :一个字符串,其中一个为channels_last(默认值)或 channels_first。输入中维度的排序。 channels_last对应于具有形状的输入(批次,高度,宽度, channel_first对应于具有形状的输入 (批次,渠道,高度,宽度)。它默认为image_data_format 在〜/ .keras / keras.json的Keras配置文件中找到的值。如果你 永远不会设置它,那么它将是“channels_last”。
所以你的(1,32,32)实际上是一个有32个通道的1x32图像。切换到(32,32,1)或将data_format参数设置为channels_first
。
有关更改默认行为的详细信息:https://keras.io/backend/
您可以使用keras.backend.image_data_format()
来设置设置,set_image_data_format(data_format)
设置channels_first
或channels_last
。
有这样的设置,因为Theano和TF处理尺寸排序的方式不同,它取决于您使用的支持。
答案 1 :(得分:2)
不,你做错了什么。以下代码:
import keras
from keras.layers import Input, Convolution2D
from keras.models import Model
inputs = Input(shape=(1, 32, 32,))
shared = Convolution2D(nb_filter=10, nb_row=8, nb_col=8,
subsample=(1, 1), border_mode='same', activation='relu')(inputs)
model = Model(inputs, shared)
model.summary()
打印以下内容:
____________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
====================================================================================================
input_1 (InputLayer) (None, 1, 32, 32) 0
____________________________________________________________________________________________________
convolution2d_1 (Convolution2D) (None, 10, 32, 32) 650 input_1[0][0]
====================================================================================================
Total params: 650
____________________________________________________________________________________________________
你可以看到Convolution2D的输出形状确实有10个通道。如果您的区域得到不同的结果,请检查image_ordering是否正确(并且有意义)。