使用素数输入维

时间:2017-10-25 17:23:15

标签: python keras conv-neural-network autoencoder max-pooling

我目前正在使用Keras(自动编码器)开发CNN模型。此类型我的输入形状为(47,47,3),即47x47图像,其中包含3个(RGB)图层。

我过去曾与一些CNN合作过,但这次我的输入尺寸是素数(47像素)。我认为这会导致我的实施出现问题,特别是在我的模型中使用MaxPooling2DUpSampling2D时。我注意到在最大合并然后上采样时会丢失一些尺寸。

使用model.summary()我可以通过(47,47,3)和MaxPooling传递 Conv2D(24) 输入并使用(2,2)内核(即24过滤器和一半的形状)我得到 (24, 24, 24) 的输出形状。

现在,如果我试图通过UpSampling使用(2,2)内核(形状的两倍)来反转它并再次卷积,我会得到一个 (48,48,3) 形状的输出。这是一个比需要的更多的行和列。

对此我认为"没问题,只需选择一个内核大小,在上采样时为您提供所需的47像素" ,但鉴于47是素数,它似乎对我而言,没有内核大小可以做到这一点。

有没有办法绕过这个不涉及将我的输入维度更改为非素数的问题?也许我在我的方法中遗漏了一些东西或者Keras有一些我忽略的功能可能在这里帮忙。

1 个答案:

答案 0 :(得分:3)

我建议您使用ZeroPadding2DCropping2D。您可以使用0非对称地填充图像,并获得图像的均匀尺寸,而无需调整图像大小。这应该解决上采样的问题。此外 - 请记住在所有卷积层中设置padding=same

修改

只是为您提供有关如何执行此类操作的示例策略:

  1. 如果在汇集网络的大小之前是奇数 - 零填充它以使其均匀。
  2. 在相应的上采样操作之后,使用裁剪以将您的要素贴图恢复为原始奇数尺寸。