Keras 2DConvolution产生非逻辑输出张量 - 32x32图像变为32xN特征映射,而不是32x32xN

时间:2017-03-30 11:52:31

标签: tensorflow computer-vision deep-learning keras convolution

根据我的理解,2D-Convolution将N个滤镜应用于输入图像,产生N个新的“图像”(=特征图)。

如果我们忽略步幅/子采样,在使用N个通道的2D卷积后,32x32图像变为Nx32x32张量:

Convolution 但是,在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

2 个答案:

答案 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_firstchannels_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是否正确(并且有意义)。