首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在均值和方差归一化之后,numpy和py手电筒会给出不同的结果?

为什么在均值和方差归一化之后,numpy和py手电筒会给出不同的结果?
EN

Stack Overflow用户
提问于 2021-09-21 07:29:39
回答 1查看 312关注 0票数 2

我正在研究一个问题,在这个问题中,矩阵必须是均值-变量归一化行。还需要在将每一行分割成小批之后应用规范化。这段代码似乎适用于Numpy,但无法使用Py手电筒(这是培训所必需的)。看上去,Py手电和Numpy的结果不同。任何帮助都将不胜感激。

示例代码:

代码语言:javascript
复制
import numpy as np
import torch


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)
    s = x.std(1).reshape(-1, 1)
    n = (x - m) / (eps + s)
    n = n.reshape(-1, nc)
    return n

# numpy
a = np.float32(np.random.randn(8, 8))
n1 = normalize(a, 4)
# torch
b = torch.tensor(a)
n2 = normalize(b, 4)
n2 = n2.numpy()

print(abs(n1-n2).max())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-21 08:08:43

在第一个示例中,您使用normalize调用a (一个numpy.ndarray ),而在第二个示例中,您使用b调用normalize (一个torch.Tensor )。

根据torch.std的文档页面,默认情况下使用贝塞尔校正来测量标准差。因此,numpy.ndarray.stdtorch.Tensor.std之间的默认行为是不同的。

如果unbiasedTrue,则使用贝塞尔的修正。否则,计算样品偏差,不作任何修正。torch.std(input, dim, unbiased, keepdim=False, *, out=None) → Tensor 参数

  • input (张量)-输入张量。
  • unbiased (bool) -是否使用贝塞尔校正(δN = 1)。

你可以自己试试:

代码语言:javascript
复制
>>> a.std(), b.std(unbiased=True), b.std(unbiased=False)
(0.8364538, tensor(0.8942), tensor(0.8365))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69264984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档