pytorch中的UpsamplingBilinear2d的初始化函数
def __init__(self, size: Optional[_size_2_t] = None,
scale_factor: Optional[_ratio_2_t] = None) -> None:
super(UpsamplingBilinear2d, self).__init__(size,
scale_factor,
mode='bilinear',
align_corners=True)
align_corners设置成了True,并且在构造函数中无法改变这个值(构造函数中只有size和scale_factor)。只要调用了他,就是align_corners=True。关于pytorch为什么要这样设置呢,我才是因为True的情况一般才是大家想要的,在resize的过程中,会有一些点的像素值,不会发生改变。如果是align_corners为False的情况,那么可能在resize之后,不会有和原来像素一样的点(如下图)
可以使用下面这样代码来实现align_corners=False情况的双线性插值。
nn.Upsample(scale_factor=2,mode='bilinear',align_corners=False)
按理说这样也不会造成精度损失,但是在TDA4当前版本(2022年5月30日)中,并不支持True的情况,所以造成了我训练的时候使用了True,到了板端变成了False,就会有三个点左右的精度损失(和使用resize的次数有关,次数少一般不会有那么大的精度损失)。
尝试解释一下为什么TDA4不支持True?我猜测是因为对于第二种情况,且resize是偶数的时候,周围点的系数(对当前的点贡献度)对于每个点都是一致的,所以会快一些。True的情况下明显每个点的系数是不同的。并且TDA4的文档中写了:
Only support Power of 2 and symmetric resize. 对称 resize和align_corners = False应该是一回事。
没有很快定位原因分析:
- 排查问题的流程不对。参数false和true的时候,都应该测试pc精度,和tda4精度。而我只是测试了true情况下的pc和板端。false下的tda4精度。原因是我认为调整了参数,板端精度还不对,就不该再测试。没有意识到这个调整已经影响了pc精度(指的是pth或者onnx精度,它们精度是一样的)。
- 对英语symmetric不熟悉。或者说是不敏感,对不对称的有啥区别。
- 对align_corners参数的具体作用不熟悉。如果非常熟悉这个参数,应该就能很快解决问题了。或者根本就不会出现这个问题。



