我目前正在使用 Keras(自动编码器)开发 CNN 模型。这种类型我的输入是形状 (47,47,3)
,这是一个 47x47 的图像,有 3 个 (RGB) 层。
我过去曾使用过一些 CNN,但这次我的输入维度是质数(47 像素)。我认为这会导致我的实现出现问题,特别是在我的模型中使用 MaxPooling2D
和 UpSampling2D
时。我注意到在最大池化和向上采样时丢失了一些维度。
使用 model.summary()
我可以看到,在通过 传递我的
和具有 (47,47,3)
输入后Conv2D(24)(2,2)
内核的 MaxPooling(即 24 个过滤器和形状的一半)我得到的输出形状为 (24, 24, 24)
。
现在,如果我尝试通过使用 (2,2)
内核(将形状加倍)进行上采样并再次进行卷积来反转它,我会得到一个 (48,48, 3)
形输出。这比需要多了一行和一列。
对此我认为“没问题,只需选择一个内核大小,在向上采样时为您提供所需的 47 像素”,但鉴于 47 是一个质数,在我看来有没有可以做到这一点的内核大小。
有没有什么方法可以绕过这个问题而不涉及将我的输入维度更改为非素数?也许我在我的方法中遗漏了一些东西或者 Keras 有一些我忽略的功能可能在这里帮助。
最佳答案
我建议你使用 ZeroPadding2D和 Cropping2D .您可以使用 0
不对称地填充您的图像,并在不调整图像大小的情况下获得均匀大小的图像。这应该可以解决上采样的问题。此外 - 请记住在所有卷积层中设置 padding=same
。
编辑:
只是给你一个关于如何执行此类操作的示例策略:
- 如果在池化之前您的网络大小是奇数 - 零填充它以使其均匀。
- 在相应的上采样操作之后,使用裁剪将特征图恢复到原始的奇数大小。
关于python - 使用质数输入维度训练 CNN 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46938504/