PyTorch中torch.arange传数值与张量参数结果不一致原因咨询
问题原因说明
这个差异是浮点数精度误差和torch.arange的参数处理逻辑共同导致的:
- 传入Python原生float类型的
start/end/step参数时,PyTorch会先将这些值转换为框架默认精度的浮点张量(通常为float32)。0.1、0.2这类十进制小数本身无法被二进制浮点数精确表示,实际存储的值会比字面量略大,累加后最后一步的结果会因为精度误差略大于设定的end值,无法满足终止条件,就不会被纳入输出结果。 - 传入本身就是
tensor类型的参数时,PyTorch会直接使用张量自带的精度做计算,不会额外做类型转换,同时内部的终止判定逻辑会适配浮点容差,只要误差在允许范围内,等于end的数值就会被纳入输出结果。
而arange(0.0,1.5,0.5)没有问题的原因很简单:0.5是2的-1次方,属于可以被二进制浮点数精确表示的数值,累加后的结果刚好等于设定的end值1.5,两种传参方式的终止判定结果一致,自然不会出现差异。
问题预判方法
可以从两个维度提前判断该问题是否会发生:
- 检查
step的数值属性:如果step是0.5、0.25、0.125这类2的负整数次幂的小数,基本不会出现该问题;如果是0.1、0.2、0.3这类无法被二进制浮点数精确表示的小数,就需要警惕。 - 检查传参类型:如果所有参数都是Python原生float,且
step属于无法精确表示的类型,大概率会出现end值被截断的情况。
如果要规避该问题,可以提前将参数转换为同精度的张量传入,或者改用torch.linspace手动指定生成的样本数量,从根源上避免浮点数累加的精度误差影响结果。
内容的提问来源于stack exchange,提问作者Christian Bueno
相关产品推荐
相关产品推荐

