PyTorch精度问题导致求和忽略小浮点数,求解决方法
解决PyTorch求和忽略小浮点数的问题
这个问题本质是单精度浮点数(float32)的精度限制导致的。PyTorch默认创建的张量是float32类型,它的有效数字只有6-7位左右。你的前三个数求和是40,加上1e-6之后,这个小数值在float32的精度范围内会被舍入,导致总和和前三个数的和无法区分。
解决方法:
改用更高精度的张量类型
创建张量时指定dtype=torch.float64(双精度),它的有效数字能达到15-16位,足够保留1e-6这样的小数值:test_tensor = torch.tensor([10, 20, 10, 1e-6], dtype=torch.float64) print(torch.sum(test_tensor) == torch.sum(test_tensor[0:-1])) # 输出tensor(False) print(torch.sum(test_tensor) - torch.sum(test_tensor[0:-1])) # 输出tensor(1.0000e-06, dtype=torch.float64)避免直接用
==比较浮点数(更通用的做法)
即使使用更高精度,浮点数运算也可能存在微小误差,直接用相等判断并不稳妥。如果需要判断差值严格大于0,可以计算两者的差值后和一个极小的阈值比较:test_tensor = torch.tensor([10, 20, 10, 1e-6]) sum_full = torch.sum(test_tensor) sum_part = torch.sum(test_tensor[0:-1]) # 判断差值是否大于一个极小值(比如1e-10) print((sum_full - sum_part) > 1e-10) # 输出tensor(True)
内容的提问来源于stack exchange,提问作者GigaByte123
相关产品推荐
相关产品推荐

