为什么执行均值方差归一化后Numpy与PyTorch的输出结果有差异?
问题根因
你遇到的NumPy与PyTorch计算结果不一致的问题,核心原因是两个库计算标准差的默认参数不同:
- NumPy的
std()方法默认ddof=0,计算总体标准差,分母为样本数N - PyTorch的
std()方法默认unbiased=True(等价于ddof=1),计算无偏样本标准差,分母为样本数N-1
修复方案
只需统一两边的标准差计算逻辑即可,推荐在PyTorch调用std时指定无偏计算关闭,和NumPy默认逻辑对齐,修改后的normalize函数如下:
def normalize(x, bsize, eps=1e-6): nc = x.shape[1] if nc % bsize != 0: raise Exception(f'Number of columns must be a multiple of bsize') x = x.reshape(-1, bsize) m = x.mean(1).reshape(-1, 1) # 针对PyTorch张量指定unbiased=False,和NumPy默认计算逻辑对齐 if isinstance(x, torch.Tensor): s = x.std(1, unbiased=False).reshape(-1, 1) else: s = x.std(1).reshape(-1, 1) n = (x - m) / (eps + s) n = n.reshape(-1, nc) return n
也可以选择修改NumPy侧的std调用为x.std(1, ddof=1),和PyTorch默认逻辑对齐,可根据你的业务计算需求选择对齐方向。
验证效果
修改后再次运行测试代码,abs(n1-n2).max()的输出会降到1e-7及以下,属于float32精度下的正常计算误差,无逻辑偏差。
内容的提问来源于stack exchange,提问作者Axeon Thra
相关产品推荐
相关产品推荐

