- 指定的维度必须包含最后一个维度的,即从最后的一个维度开始从后往前开始覆盖的。
比如我们的数据的shape是[4, 2, 3],
那么normalized_shape可以是[3](最后一维上进行Norm处理),
也可以是[2, 3](Norm最后两个维度),也可以是[4, 2, 3](对整个维度进行Norm),但不能是[2]或者[4, 2],否则会报以下错误(以normalized_shape=[2]为例):
RuntimeError:
Given normalized_shape=[2],
expected input with shape [*, 2],
but got input of size[4, 2, 3]
————————————————
- nn.LayerNorm 实例化的时候,必须将其自身对应的参数,搬到实际的设备上;
def forward(self, x):
# torch.Size([1, 4, 96, 12])
# print('the current group input: \n', x.shape)
# 每组的输出是256通道, 15*1大小的特征图;
x1 = self.conv1(x)
norm1 = nn.LayerNorm(x1.size()[1:]).to(x1.device)
x1 = norm1(x1)
x1 = self.act(x1)
# torch.Size [1, 256, 15, 1]
x2 = self.conv2(x1)
norm2 = nn.LayerNorm(x2.size()[1:]).to(x2.device)
x2 = norm2(x2)
x2 = self.act(x2)
x3 = self.conv3(x2)
norm3 = nn.LayerNorm(x3.size()[1:]).to(x3.device)
x3 = norm3(x3)
x3 = self.act(x3)
让其输入数据和layerNorm 自身的可训练的参数在同一个设备上,
否则,会报如下错误, 很容易让人误认为是cuda 的内存不足,或者其他问题;
RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling `cublasCreate(handle)`
- 作用
Layer Normalization是针对自然语言处理领域提出的,例如像RNN循环神经网络。为什么不使用直接BN呢,因为在RNN这类时序网络中,时序的长度并不是一个定值(网络深度不一定相同),比如每句话的长短都不一定相同,所有很难去使用BN,所以作者提出了Layer Normalization(注意,在图像处理领域中BN比LN是更有效的,但现在很多人将自然语言领域的模型用来处理图像,比如Vision Transformer,此时还是会涉及到LN)。
reference:
https://blog.csdn.net/qq_37541097/article/details/117653177