我正在研究一個問題,其中一個矩陣必須逐行進行均值化。此外,還要求在將每一行分割成小批之后再進行歸一化。 這些代碼似乎對Numpy有效,但在Pytorch(訓練時需要)上卻失敗了。 似乎Pytorch和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[/span]。
b = torch.tensor(a)
n2 = normalize(b, 4)
n2 = n2.numpy()
print(abs(n1-n2).max())
uj5u.com熱心網友回復:
在第一個例子中,你用a,一個numpy.ndarray呼叫normalize,而在第二個例子中,你用b,一個torch.Tensor呼叫normalize。
根據torch.std的檔案頁面,貝塞爾修正被默認用于測量標準偏差。因此,numpy.ndarray.std和torch.Tensor.std之間的默認行為有所不同。
如果unbiased是True,將使用Bessel的校正。否則,將計算樣本偏差,不進行任何修正。
torch.std(input, dim, unbiased, keepdim=False, *, out=None) → Tensor
引數
input(Tensor) - 輸入張量。unbiased(bool) - 是否使用Bessel的校正(δN = 1)。
你可以自己試試:
>>> a. std(), b.std(unbiased=True), b.std(unbiased=False)
(0.8364538, tensor(0.8942), tensor(0.8365)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326852.html
標籤:
上一篇:SQL回傳某列數值發生變化的記錄
下一篇:為N個體的問題制作一個跟蹤影片
