栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pytorch模型使用nn.UpsamplingBilinear2d转到TDA4有精度损失的原因

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pytorch模型使用nn.UpsamplingBilinear2d转到TDA4有精度损失的原因

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应该是一回事。

没有很快定位原因分析:

  1. 排查问题的流程不对。参数false和true的时候,都应该测试pc精度,和tda4精度。而我只是测试了true情况下的pc和板端。false下的tda4精度。原因是我认为调整了参数,板端精度还不对,就不该再测试。没有意识到这个调整已经影响了pc精度(指的是pth或者onnx精度,它们精度是一样的)。
  2. 对英语symmetric不熟悉。或者说是不敏感,对不对称的有啥区别。
  3. 对align_corners参数的具体作用不熟悉。如果非常熟悉这个参数,应该就能很快解决问题了。或者根本就不会出现这个问题。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938519.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号