nn.LayerNorm 使用注意点:

  1. 指定的维度必须包含最后一个维度的,即从最后的一个维度开始从后往前开始覆盖的。

比如我们的数据的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]
————————————————
  1. 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)`
  1. 作用
    Layer Normalization是针对自然语言处理领域提出的,例如像RNN循环神经网络。为什么不使用直接BN呢,因为在RNN这类时序网络中,时序的长度并不是一个定值(网络深度不一定相同),比如每句话的长短都不一定相同,所有很难去使用BN,所以作者提出了Layer Normalization(注意,在图像处理领域中BN比LN是更有效的,但现在很多人将自然语言领域的模型用来处理图像,比如Vision Transformer,此时还是会涉及到LN)。

reference:
https://blog.csdn.net/qq_37541097/article/details/117653177

你可能感兴趣的:(#,深度学习,python,开发语言)