BatchNorm和LayerNorm两者都是将张量的数据进行标准化的函数,区别在于BatchNorm是把一个batch里的所有样本作为元素做标准化,类似于我们统计学中讲的“组间”。layerNorm是把一个样本中所有数据作为元素做标准化,类似于统计学中的“组内”。下面直接举例说明。
首先我这里定义了一个shape为(2,3,2,2)的一个数据。对应(N,C,H,W)表示我这一堆数据中有2个样本,每个样本是一个通道数(channel)为3,长宽为2的图片。如下图。
#设置BatchNorm2d参数bn=nn.BatchNorm2d(3) #注意参数必须和channel值相同。
print(bn(X)) #输入的X必须是4维的张量(N,C,H,W)
注意看,经过标准化处理后,第一张图片值全部为负,第二张全部为正,这是因为第二张图片设定的值大于第一张。所以这下我们可以理解了BatchNorm是把每一张图片(样本)当做一个元素,对这些元素做标准化处理。
同理可得BatchNorm1d
定义一个shape为(2,3)的张量
#定义BatchNorm1d的参数
bn=nn.BatchNorm1d(3) # shape必须与channel值相同
print(bn(X)) #输入的X必须是二维或者三维张量(N,C)或者(N,C,L)
从输出结果可知,1d与2d的作用相同,只不过从2*2的图片变成了1*L长的序列。
下面来看LayerNorm 。
仍然使用最开始的(2,3,2,2)的数据
#定义LayerNorm
ln=nn.LayerNorm([3,2,2]) # 参数shape必须与每个图片的形状相同
print(ln(X))
这次可以看到每个样本中都是最后一个channel值为正,这是因为第三个通道的值大得多。
LayerNorm是对样本里所有值做标准化处理,而与另外一个样本无关,这是与BatchNorm的根本区别。
同理 BatchNorm和 LayerNorm还可以用在nlp的序列模型中
定义一个shape为(2,4,4)的序列
#定义BatchNorm和LayerNorm使其能用于nlp序列
bn=BatchNorm1d(4) #参数必须与序列的最后一个维度相同
ln=LayerNorm(4)#参数必须与序列的最后一个维度相同
print(bn(X))
print(ln(X))
LayerNorm结果
BatchNorm1d结果