【问题标题】:Issues Training CNN with Prime number input dimensions问题训练具有素数输入维度的 CNN
【发布时间】:2018-04-06 21:39:38
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    编辑:

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

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

    【讨论】:

    • 是的,填充是一样的,看看你看到了什么:)谢谢
    • 我正在检查您的建议,所以在进行每个池化和采样之前,我应该将该层包含在我的模型中吗?我想padding 参数应该使得结果大小不是正确的?
    • 我更新了我的答案。有不懂的地方告诉我。
    • 谢谢,现在清楚多了。我尝试了您的建议并添加了一层填充以使其成为(49,49),例如,我现在可以将其与(3,3) 内核分开。然后将其裁剪回 47 年代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2018-02-10
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多