为何set_printoptions(precision=1)后张量浮点仍波动?两种平均结果不等
张量平均两种实现的浮点精度差异问题
我跟随教程学习张量操作时,教程提到两种实现张量平均的方法:一种是手动循环遍历张量运算,另一种是通过与单位三角矩阵做点积的更优方案(可保留空间信息),教程中torch.allclose(xbow, xbow2)返回True,证明两种方法结果一致。但我复现后该返回值为False,两种方法的张量运算结果存在差异。
经咨询,得知是torch.randn()生成随机张量带来的浮点精度偏差,但不清楚为何教程无此问题。我尝试用set_printoptions(precision=1)限制张量精度,结果仍为False。
复现代码与现象
1. 生成随机张量
torch.manual_seed(1337) B,T,C = 4,8,2 # batch, time, channels x = torch.randn(B,T,C) print(x.shape) print(x[0])
输出:
torch.Size([4, 8, 2]) tensor([[ 0.2, -0.1], [-0.4, -0.9], [ 0.6, 0.0], [ 1.0, 0.1], [ 0.4, 1.2], [-1.3, -0.5], [ 0.2, -0.2], [-0.9, 1.5]])
2. 循环实现张量平均
# We want x[b, t] = mean_{i<=t} x[b,i] xbow = torch.zeros((B,T,C)) for b in range(B): for t in range(T): xprev = x[b, :t+1] # (t,C) xbow[b,t] = torch.mean(xprev, 0)
打印xbow[0]结果:
tensor([[ 0.2, -0.1], [-0.1, -0.5], [ 0.1, -0.3], [ 0.4, -0.2], [ 0.4, 0.1], [ 0.1, -0.0], [ 0.1, -0.1], [-0.0, 0.1]])
3. 三角矩阵点积实现张量平均
wei = torch.tril(torch.ones(T,T)) wei = wei / wei.sum(1, keepdim=True) xbow2 = wei @ x # B(T, T, T) @ (B, T, C ) ----> (B, T, C)
打印xbow2[0]结果:
tensor([[ 0.2, -0.1], [-0.1, -0.5], [ 0.1, -0.3], [ 0.4, -0.2], [ 0.4, 0.1], [ 0.1, -0.0], [ 0.1, -0.1], [-0.0, 0.1]])
从打印结果看两者一致,但用xbow == xbow2对比时,能发现部分张量元素不等,torch.allclose(xbow, xbow2)返回False。
疑问与需求
我希望两种计算方法的浮点值完全精确,虽已知可用torch.allclose(xbow,xbow2)判断近似相等,但想了解:
- 如何保持精度以避免未来信息损失(如图像平均压缩场景)
- 如何规避此类浮点波动问题
内容的提问来源于stack exchange,提问作者RedSean
相关产品推荐
相关产品推荐

