根据我的理解,2D-Convolution将N个滤镜应用于输入图像,产生N个新的“图像”(=特征图) .
如果我们忽略步幅/子采样,在使用N个通道的2D卷积之后,32x32图像变为Nx32x32张量:
但是,在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 回答
可能是因为输入格式顺序 .
来自Keras的文档,Conv2D采用了这个参数
所以你的(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处理尺寸排序不同,它取决于您使用的支持 .
不,你做错了什么 . 以下代码:
打印以下内容:
你可以看到Convolution2D的输出形状确实有10个通道 . 如果区域得到不同的结果,请检查image_ordering是否正确(并且有意义) .