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

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

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

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

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

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

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

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

最佳答案

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

编辑:

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

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

关于python - 使用质数输入维度训练 CNN 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46938504/

相关文章:

python - 连接两个 NumPy 数组得到 "ValueError: all the input arrays must have same number of dimensions"

python - CNN 多输入,检查模型输入 : Expected to see 2 array(s), 时出错,但得到以下 1 个数组列表:

python - CNN 的输入形状不兼容

python - 如何制作具有不同输入形状的批处理的神经网络

python - 如何在 Tensorflow 或 Pytorch 中实现特定位置的卷积滤波器?

python - 无法在 TensorFlow 中完全分离模型的输出

python - Pandas :分类数据的多个直方图

python - 如何修复嵌套的 if/for 循环

python - args : def func(value:str) 之后的两个点和一个类是什么意思

python - Keras:制作一个神经网络来找到一个数字的模数