【问题标题】:How to concat two tensors of size [B,C,13,18] and [B,C,14,18] respectively in Pytorch?如何在 Pytorch 中分别连接两个大小为 [B,C,13,18] 和 [B,C,14,18] 的张量?
【发布时间】:2020-11-18 03:46:42
【问题描述】:

当图像或张量的高度或宽度变得奇数时,我经常遇到这个问题。

例如,假设原始张量的大小为 [B,C,13,18]。在转发一个 strided-2 conv 和其他几个 conv 层后,它的大小将变为 [B,C,7,9]。大多数情况下,如果我们将输出上采样 2 并将其与原始特征图相连接,则会发生错误。

我发现在许多源代码中,他们使用偶数大小(如 (512,512))进行训练,因此不会发生此类问题。但是为了测试,我使用原始图像大小来保持细节,经常遇到这个问题。

我该怎么办?我需要更改网络架构吗?

【问题讨论】:

    标签: deep-learning computer-vision pytorch concatenation conv-neural-network


    【解决方案1】:

    连接形状不兼容的张量没有意义。信息缺失,需要自己指定。问题是,您对这种串联有何期望?通常,您用零填充输入或截断输出,以获得兼容的形状(在一般情况下,偶数不是必需的条件)。如果高度和宽度足够大,边缘效应应该可以忽略不计(好吧,除了可能在边缘,这取决于)。

    因此,如果您只处理卷积,严格来说无需更改架构,只需在看起来合适的地方添加填充层即可。

    【讨论】:

    • 感谢您的回复!与其填充或截断,不如上采样到原始大小?例如,保存输入大小 [13,18] 并将输出 [7,9] 上采样到 [13,18] 而不是上采样 2。我还有一个问题:当我们有不同图像大小的数据集时,有时输入大小在没有填充层的情况下已经满足兼容条件,但有时张量变得不兼容,就像大小是奇数一样。那么对于这种情况我该怎么办呢?看来padding层应该只在某些特定情况下才起作用,这不是一个通用的解决方案。
    • 恕我直言,此时这是一个网络架构设计问题,没有唯一的答案。但想法是仅在可忽略不计的情况下使用填充,而不是填充输入大小的一半。在这种情况下,我当然宁愿使用上采样。确实,如果输入的维度不一致,则无法使用填充。我认为没有一种非常通用的方法可以确保输入和输出形状相同,但我可能错了。如果输入形状变化不大,您可以使用上采样层作为指定输出形状而不是缩放因子的第一层和最后一层。
    • 另外,不要忘记在某些条件下使用 if/else 并没有禁止您使用输入/输出的填充。至少在 Pytorch 中,网络图可以动态变化,因此您可以在必要时启用填充,否则禁用它。它并不优雅,但也不可怕。这样核心网络保持不变并系统地用于处理输入,只有填充部分是特定的。
    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 2019-04-27
    • 2021-12-27
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多