You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非整数缩放因子下区域插值降采样的异常现象及原理疑问

非整数缩放因子下区域插值降采样的异常现象及原理疑问

最近在研究PyTorch中F.interpolate的area插值降采样,结果发现当使用非整数缩放因子时,实际输出和我对区域插值的理解完全对不上,想跟大家聊聊这个问题。

首先说下我对区域插值的理解:按定义,区域插值是基于像素面积加权的。比如如果缩放因子是1.5,输出像素(0,0)应该包含输入(0,0)的完整像素面积、(0,1)和(1,0)各一半的面积,以及(1,1)的1/4面积,最终的权重是输入像素的对应面积除以(1.5)²。

但实际测试下来却不是这么回事,我写了一段测试代码:

import torch
import torch.nn.functional as F

x = torch.tensor(
    [[3, 106, 107, 40, 148, 112, 254, 151],
    [62, 173, 91, 93, 33, 111, 139, 25],
    [99, 137, 80, 231, 101, 204, 74, 219],
    [240, 173, 85, 14, 40, 230, 160, 152],
    [230, 200, 177, 149, 173, 239, 103, 74],
    [19, 50, 209, 82, 241, 103, 3, 87],
    [252, 191, 55, 154, 171, 107, 6, 123],
    [7, 101, 168, 85, 115, 103, 32, 11]],
dtype=torch.float).unsqueeze(0).unsqueeze(0)
print(x.shape, x.sum())
for scale in [8/6, 2]:
    
    pixel_area = scale**2
    y = F.interpolate(x, scale_factor=1/scale, mode="area")
    print(y.shape, y, y.sum()*pixel_area)
    print((3 + 106*(scale-1) + 62*(scale-1) + 173*(scale-1)**2)/pixel_area)
    print((11 + 123*(scale-1) + 32*(scale-1) + 6*(scale-1)**2)/pixel_area)

这段代码的运行输出是:

torch.Size([1, 1, 8, 8]) tensor(7707.)
torch.Size([1, 1, 6, 6]) tensor([[[[ 86.0000, 119.2500,  82.7500, 101.0000, 154.0000, 142.2500],
          [117.7500, 120.2500, 123.7500, 112.2500, 132.0000, 114.2500],
          [162.2500, 118.7500, 102.5000, 143.7500, 167.0000, 151.2500],
          [124.7500, 159.0000, 154.2500, 189.0000, 112.0000,  66.7500],
          [128.0000, 126.2500, 125.0000, 155.5000,  54.7500,  54.7500],
          [137.7500, 128.7500, 115.5000, 124.0000,  62.0000,  43.0000]]]]) tensor(7665.7778)
43.99999999999999
35.62499999999999
torch.Size([1, 1, 4, 4]) tensor([[[[ 86.0000,  82.7500, 101.0000, 142.2500],
          [162.2500, 102.5000, 143.7500, 151.2500],
          [124.7500, 154.2500, 189.0000,  66.7500],
          [137.7500, 115.5000, 124.0000,  43.0000]]]]) tensor(7707.)
86.0
43.0

从输出里我发现了几个很奇怪的点:

  • 当scale=8/6时,y.sum()*pixel_area的结果是7665.7778,和原张量的总和7707不相等;但scale=2的时候两者是完全相等的。
  • 我手动计算了scale=8/6时输出(0,0)的预期值,结果是43.999...(约44),但实际输出却是86。
  • 更离谱的是,不同缩放因子下,输出的(0,0)像素值居然都是86,这完全不符合预期啊。

后来我仔细对比了输出和输入的关系,发现一个更惊讶的点:当scale=8/6时,实际的计算逻辑像是用了2x2的滑动窗口平均,步长1x1,这和我理解的区域插值定义完全不符啊?

有没有大佬能解释下这是为什么?PyTorch的area插值在非整数缩放因子下的实际逻辑到底是什么?


备注:内容来源于stack exchange,提问作者Wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:13:00