我正在研究一个问题,在这个问题中,矩阵必须是均值-变量归一化行。还需要在将每一行分割成小批之后应用规范化。这段代码似乎适用于Numpy,但无法使用Py手电筒(这是培训所必需的)。看上去,Py手电和Numpy的结果不同。任何帮助都将不胜感激。
示例代码:
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())发布于 2021-09-21 08:08:43
在第一个示例中,您使用normalize调用a (一个numpy.ndarray ),而在第二个示例中,您使用b调用normalize (一个torch.Tensor )。
根据torch.std的文档页面,默认情况下使用贝塞尔校正来测量标准差。因此,numpy.ndarray.std和torch.Tensor.std之间的默认行为是不同的。
如果
unbiased是True,则使用贝塞尔的修正。否则,计算样品偏差,不作任何修正。torch.std(input, dim, unbiased, keepdim=False, *, out=None) → Tensor参数
input (张量)-输入张量。unbiased (bool) -是否使用贝塞尔校正(δN = 1)。你可以自己试试:
>>> a.std(), b.std(unbiased=True), b.std(unbiased=False)
(0.8364538, tensor(0.8942), tensor(0.8365))https://stackoverflow.com/questions/69264984
复制相似问题