CV中的BN:
(N, C, H, W),以(N, H, W)为单位求均值与方差
CV中的LN:
由于在LN初始化的时候需要输入参数normalized_shape
,即规范化的单位(目的是为了给单位内部的所有element设置不同的gamma和beta,详情参见我的上一篇文章),因此如果按照图中的这种做法:
normalized_shape=[C,H,W]
eg.
>>> # Image Example
>>> N, C, H, W = 20, 5, 10, 10
>>> input = torch.randn(N, C, H, W)
>>> # Normalize over the last three dimensions (i.e. the channel and spatial dimensions)
>>> # as shown in the image below
>>> layer_norm = nn.LayerNorm([C, H, W])
>>> output = layer_norm(input)
但是这有一个问题:在__init__
定义网络模块初始化的时候需要输入feature的(C,H,W),C还好一点,一般一个stage的C都是相同的,但是不同的图片的(H, W)却是不同的,很难提前定义好,除非把所有图片resize到相同大小之后再输入网络,因此CNN中的LN一般是这样实现:
https://github.com/open-mmlab/mmclassification/blob/master/mmcls/models/backbones/convnext.py
把channel移到最后一位,规范化单位为所有channel,相当于以pixel为单位进行规范化
NLP中的LN:
设词向量矩阵为(N, sentence_length, embedding_dim)
>>> layer_norm = nn.LayerNorm(embedding_dim)
就是以一个词向量为单位做规范化
NLP中的BN:
把矩阵看成(N,C,H*W)即可,但是实际上NLP中的BN没啥用