首页 文章

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

提问于
浏览
2

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

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

Convolution
但是,在Keras中,32x32输入产生32xN输出 . 所以,我的问题是,如何应用降维?这一步是否涉及另一个隐藏层?

如果是这样,网络是否失去了查看图像的能力 - 即2D实体?


此代码可以重现我的上述声明:

```java
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 回答

  • 2

    可能是因为输入格式顺序 .

    来自Keras的文档,Conv2D采用了这个参数

    data_format:一个字符串,其中一个为channels_last(默认值)或channels_first . 输入中维度的顺序 . channels_last对应于具有形状(批次,高度,宽度,通道)的输入,而channels_first对应于具有形状的输入(批次,通道,高度,宽度) . 它默认为在〜/ .keras / keras.json的Keras配置文件中找到的image_data_format值 . 如果你从未设置它,那么它将是“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处理尺寸排序不同,它取决于您使用的支持 .

  • 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是否正确(并且有意义) .

相关问题