Batchnorm
对于Batchnorm, 其有三种形式
BatchNorm1d的输入为 ( B , N ) \left(B,N\right) (B,N)或者是 ( B , N , D ) \left(B,N,D\right) (B,N,D).
BatchNorm2d的输入为 ( B , C , H , W ) \left(B,C,H,W\right) (B,C,H,W).
BatchNorm3d的输入为 ( B , D , D , H , W ) \left(B,D,D,H,W\right) (B,D,D,H,W).
我一般遇到的数据是 ( B , N ) \left(B,N\right) (B,N)或者是 ( B , N , D ) \left(B,N,D\right) (B,N,D), 因此只需要用到BatchNorm1d(N).
Layernorm
对于Layernorm, 我一般只用到LayerNorm(D)或LayerNorm([N,D])
归一化是对取出的矩阵的每一个元素都参与计算均值与方差, 相当于矩阵层面的标准化而不仅仅是变量或者样本。
import torch
x = torch.randn(32, 96)
norm = torch.nn.BatchNorm1d(96)
x = norm(x)
print(x[:,0].mean())
print(x[:,0].std())
x = torch.randn(32, 96)
norm = torch.nn.LayerNorm(96)
x = norm(x)
print(x[0,:].mean())
print(x[0,:].std())
x = torch.randn(32, 96, 64)
norm = torch.nn.BatchNorm1d(96)
x = norm(x)
print(x[:,0,:].mean())
print(x[:,0,:].std())
x = torch.randn(32, 96, 64)
norm = torch.nn.LayerNorm(64)
x = norm(x)
print(x[0,0,:].mean())
print(x[0,0,:].std())
x = torch.randn(32, 96, 64)
norm = torch.nn.LayerNorm([96,64])
x = norm(x)
print(x[0,:,:].mean())
print(x[0,:,:].std())
-
归一化是对取出的矩阵的每一个元素都参与计算均值与方差。
-
Batchnorm是从前往后的, Layernorm是从后往前的。
-
Layernorm参数是什么维度就对那一种维度进行归一化; Batchnorm是相反的参数是哪一个维度就把那个维度剩下的去做归一化。