问题训练 CNN 与素数输入维度

Dar*_*nus 2 python autoencoder conv-neural-network keras max-pooling

我目前正在使用 Keras(自动编码器)开发 CNN 模型。这种类型的输入是 shape (47,47,3),即具有 3 (RGB) 层的 47x47 图像。

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

使用model.summary()我可以看到,在将我的(47,47,3)输入通过 aConv2D(24)和 MaxPooling 与(2,2)内核(即 24 个过滤器和一半的形状)后,我得到了(24, 24, 24).

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

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

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

Mar*_*jko 5

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

编辑:

只是给你一个关于如何执行此类操作的示例策略:

  1. 如果在池化之前网络的大小是奇数 - 将其填充为零以使其均匀。
  2. 在相应的上采样操作之后,使用裁剪将您的特征图恢复到原始奇数大小。