如何解决被称为“区域”的上采样方法是什么?
PyTorch函数torch.nn.functional.interpolate
包含几种上采样模式,例如:nearest
,linear
,bilinear
,bicubic
,trilinear
, area
。
area
上采样模式有什么用?
解决方法
看一下源代码,area
插值等效于通过adaptive average pooling调整张量的大小。您可以参考this question了解自适应平均池的说明。因此area
插值比下采样更适用于下采样。
正如jodag所说,它正在使用自适应平均池调整大小。虽然该链接的答案旨在解释什么是自适应平均池,但我发现该解释有点含糊。
TL; DR area
的{{1}}模式可能是思考何时要对图像进行降采样的最直观的方法之一。
您可以将其视为对原始图像应用平均低通滤波器(LPF),然后进行采样。在采样之前应用 LPF 是为了防止在降采样的图像中可能出现 alias 。 混叠可能会在缩小的图像中产生波纹图案。
之所以称为“区域”,是因为在平均输入像素时,它(大致)保留了输入和输出形状之间的面积比。更具体地说,输出图像中的每个像素将是输入图像中各个区域的平均值,其中该区域的torch.nn.functional.interpolate
将大致等于输出图像的面积与输入图像的面积之比。
此外,带有1/area
的{{1}}函数调用源函数interpolate
(在C ++中实现),该函数将输出张量中的每个像素分配给计算区域内所有像素强度的平均值。输入的该区域是按像素计算的,并且可以针对不同像素改变大小。计算方法是将输出像素的高度和宽度乘以输入和输出(按此顺序)的高度和宽度之比(分别),然后取一次mode = 'area'
(用于区域的起始索引)然后是adaptie_avg_pool2d
(用于区域的结束索引)的结果值。
下面是floor
中发生的情况的深入分析:
首先,如此处所述,您可以在这里找到自适应平均池化的源代码(在C ++中):source
看一下发生魔术的函数(或者至少是单帧CPU上的魔术)ceil
,我们有5个嵌套循环,分别在通道尺寸,宽度,高度,主体内运行第三循环的魔力发生了:
首先计算输入图像中用于计算当前像素值的区域(回想一下,我们有宽度和高度循环可遍历输出中的所有像素)。 怎么做?
使用简单的高度和宽度起始索引和终止索引计算方法,如下所示:nn.AdaptiveAvgPool2d
代表起点,static void adaptive_avg_pool2d_single_out_frame
以及宽度同样。
然后,所有要做的就是简单地对该区域和当前通道中所有像素的强度求平均,并将结果放置在当前输出像素中。
我编写了一个简单的Python代码段,该代码段以相同的方式(循环,天真)执行相同的操作,并产生相同的结果。它需要张量floor((input_height/output_height) * current_output_pixel_height)
并使用自适应平均池来调整ceil((input_height/output_height) * (current_output_pixel_height+1))
的大小以通过两种方式调整a
的形状-一次使用内置的a
,一次将其翻译成Python C ++中的源函数:output_shape
。内置函数的结果保存到nn.AdaptiveAvgPool2d
中,我的翻译保存到static void adaptive_avg_pool2d_single_out_frame
中。您可以看到结果是等效的(可以进一步研究空间形状并对此进行验证):
b
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。