使用质数输入维度训练 CNN 的问题

Issues Training CNN with Prime number input dimensions

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

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

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

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

对此我认为 "no problem, just chose a kernel size that gives you the desired 47 pixels when up sampling",但鉴于 47 是质数,在我看来没有内核大小可以做到这一点。

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

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

编辑:

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

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