torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None)
size或scale_factor参数对输入图像进行上/下采样操作。mode参数指定的算法。mini-batch * channels * width。mini-batch * channels * height * width。mini-batch * channels * depth * height * width。mode为:
size是互斥参数,只能指定一个。nearest linear bilinear bicubic trilinear和area。默认是nearest。True,输入和输出的张量在角像素中心对齐,这样可以保留边界像素的值。如果设置为False,输入和输出张量由它们的角点的角像素值对齐(具体说明见下面图片),边界部分使用边界值的插值填充,边界的像素值可能会丢失。受影响的mode有linear bilinear bicubic和trilinear。默认为False。如果mode使用bicubic时,可能生成的图像有大于255或小于0的值,可以使用tensor.clamp(min=0, max=255)做截断。
0.3.1版本之前默认值是True,之后默认值为False,使用别人的源码时要注意一下这个问题。
参考 立夏之光的知乎文章。


左边为False,右边为True。
两种方式在中间像素的插值上区别不大,主要差别还是边界像素。一般的任务中边界的值不那么重要,但是会影响语义分割的mIoU指标,使用True能更好的保留边界。
具体改动见我的pull request。
CPU模式下,如果scale_factor为1时,使用bicubic插值方式,本来预计的处理结果是把原图复制一下,不做任何处理。但是处理的时候忘了乘mini-batch了,导致复制的时候只复制了n==1的图,其它的图均为初始值0。