Deep learning 如何在Pytorch中分别求出[B,C,13,18]和[B,C,14,18]大小的两个张量?

Deep learning 如何在Pytorch中分别求出[B,C,13,18]和[B,C,14,18]大小的两个张量?,deep-learning,computer-vision,pytorch,concatenation,conv-neural-network,Deep Learning,Computer Vision,Pytorch,Concatenation,Conv Neural Network,当图像或张量的高度或宽度变为奇数时,我经常遇到这个问题 例如,假设原始张量的大小为[B,C,13,18]。在转发一个跨步-2 conv和其他几个conv层后,其大小将变为[B,C,7,9]。大多数情况下,如果我们将输出的样本增加2,并使用原始特征映射将其合并,则会发生错误 我发现在许多源代码中,它们使用(512512)这样的偶数大小进行训练,所以这种问题不会发生。但在测试中,我使用原始图像的大小来保持细节,经常遇到这个问题 我该怎么办?是否需要更改网络体系结构?将张量与不兼容的形状连接起来没有意

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

例如,假设原始张量的大小为[B,C,13,18]。在转发一个跨步-2 conv和其他几个conv层后,其大小将变为[B,C,7,9]。大多数情况下,如果我们将输出的样本增加2,并使用原始特征映射将其合并,则会发生错误

我发现在许多源代码中,它们使用(512512)这样的偶数大小进行训练,所以这种问题不会发生。但在测试中,我使用原始图像的大小来保持细节,经常遇到这个问题


我该怎么办?是否需要更改网络体系结构?

将张量与不兼容的形状连接起来没有意义。信息丢失,您需要自己指定。问题是,您希望从这个连接中得到什么?通常,为了获得兼容的形状,用零填充输入或截断输出(在一般情况下,偶数不是必需的条件)。如果高度和宽度足够大,则边缘效应应该可以忽略不计(好吧,除非可能在边缘上,这取决于)


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

谢谢您的回复!与其填充或截断,不如将采样增加到原始大小?例如,保存输入大小[13,18],并将输出[7,9]向上采样为[13,18],而不是向上采样2。我仍然有一个问题:当我们有一个具有不同图像大小的数据集时,有时输入大小在没有填充层的情况下已经满足兼容条件,但有时张量变得不兼容,就像大小是奇数一样。那我该怎么办呢?似乎填充层只能在某些特定情况下工作,这不是一个通用的解决方案。IMHO,在这一点上,这是一个网络架构设计问题,没有唯一的答案。但其思想是仅在可以忽略不计的情况下使用填充,而不是填充输入大小的一半。在这种情况下,我当然更愿意使用上采样。如果输入的维度不一致,则不能使用填充。我不认为有一种非常通用的方法可以确保输入和输出形状是相同的,但我可能错了。如果输入形状变化不大,可以使用上采样层作为指定输出形状的第一层和最后一层,而不是比例因子。此外,不要忘记,在某些情况下,没有任何东西禁止使用If/else填充输入/输出。至少在Pytorch中,网络图可以动态更改,因此可以在必要时启用填充,否则禁用填充。它不优雅,但也不可怕。这样,核心网络保持不变,系统地用于处理输入,只有填充部分是特定的。