【问题标题】: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 像素)。我认为这会导致我的实现出现问题,特别是在我的模型中使用 MaxPooling2D 和 UpSampling2D 时。我注意到在最大池化然后上采样时会丢失一些维度。

使用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】:

    我建议您使用ZeroPadding2D 和Cropping2D。您可以使用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
    相关资源
    最近更新 更多