Tensorflow Keras 2D卷积产生非逻辑输出张量-32x32图像变成32xN特征映射,而不是32x32xN

Tensorflow Keras 2D卷积产生非逻辑输出张量-32x32图像变成32xN特征映射,而不是32x32xN,tensorflow,computer-vision,deep-learning,keras,convolution,Tensorflow,Computer Vision,Deep Learning,Keras,Convolution,根据我的理解,二维卷积对输入图像应用N个滤波器,产生N个新的“图像”(=特征图) 如果我们忽略步幅/子采样,32x32图像在与N个通道进行2D卷积后成为NX332x32张量: 然而,在Keras中,32x32输入产生32xN输出。所以,我的问题是,如何应用降维?这一步是否涉及到另一个隐藏层 如果是这样的话,网络是否正在失去其查看图像的本来面目——即二维实体的能力 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 此代码可以复制我的上述声明: i

根据我的理解,二维卷积对输入图像应用N个滤波器,产生N个新的“图像”(=特征图)

如果我们忽略步幅/子采样,32x32图像在与N个通道进行2D卷积后成为NX332x32张量:

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

如果是这样的话,网络是否正在失去其查看图像的本来面目——即二维实体的能力

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

此代码可以复制我的上述声明:

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)
当我们对32x32灰度图像应用10个过滤器(=N)时,它会产生

1=>(?,1,32,32)

2=>(?,1,32,10)

在哪里?是未指定的批次大小,1是输入通道的数量(RGB为3,灰度为1)

输入的形状如预期的那样为32x32。
但是,卷积的输出是32xN维而不是32x32xN,这可能是因为输入格式顺序

从Keras docs Conv2D获取此参数

数据\u格式:一个字符串、最后一个(默认)通道之一或 首先是你。输入中尺寸的顺序。 通道_last对应于具有形状(批次、高度、宽度、, 通道)而通道_首先对应于具有形状的输入 (批次、通道、高度、宽度)。它默认为图像\数据\格式 在~/.Keras/Keras.json的Keras配置文件中找到值。如果你 永远不要设置它,那么它将是“最后一个”

因此,您的(1,32,32)实际上是一个具有32个通道的1x32图像。切换到(32、32、1)或将data\u format参数设置为
channels\u first

有关更改默认行为的详细信息: 您可以使用
keras.backend.image\u data\u format()
获取设置,并
set\u image\u data\u format(data\u format)
设置
channels\u first
channels\u last


之所以有此设置,是因为ANO和TF处理维度顺序不同,这取决于您使用的备份。不,您做错了。以下代码:

 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
____________________________________________________________________________________________________

你可以看到卷积2D的输出形状确实有10个通道。如果您得到不同的结果,请检查图像顺序是否正确(并且有意义)。

感谢您的编写,但这仍然是一样的:对于10个通道,它应该是(10,32,32)。不管顺序如何,我期望32x32x10输出实际上是否定的。对跨距=(1,1)且填充=相同的1x32x32(WxHxC)应用卷积应产生1x32x10(WxHxC)。步长=(1,1)和padding=相同将不会更改图像的大小(WxH),但会生成num_过滤器通道。我无法使用Theano后端复制您的输出。model.summary()可能更适合查看整个网络的输入/输出形状。此外,如果您使用的是TF后端(正如您标记的那样),那么输入形状是错误的,应该是(32,32,1)。我使用的是tensorflow后端,但按无顺序馈送,所以这就是问题所在:-)谢谢,问题确实是,我必须添加dim_ordering='th',这可能是您关于keras配置文件的默认设置。由于你们都给出了正确的答案,我选择接受第一个(不是你的),希望没问题。