nn.BatchNorm 和nn.LayerNorm详解

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结果

 

 

物联沃分享整理
物联沃-IOTWORD物联网 » nn.BatchNorm 和nn.LayerNorm详解

发表评论