参考ConvNeXt中的Layer Normalization(LN) - 海斌的文章 - 知乎
https://zhuanlan.zhihu.com/p/481901798

Layer Norm本来是一个样本norm自己,如图所示:

也就是说,在[C,H,W]维进行归一化
而ConvNeXt中是这样:

也就是在C的维度归一化,即单一像素的所有channel做归一化。

两者实现方式上有所不同。
可以用F.layer_norm实现,也可以用nn.layer_norm实现,这里选用F.layer_norm

看ConvNeXt的实现
class LayerNorm2d(nn.LayerNorm):"""LayerNorm on channels for 2d images.Args:num_channels (int): The number of channels of the input tensor.eps (float): a value added to the denominator for numerical stability.Defaults to 1e-5.elementwise_affine (bool): a boolean value that when set to ``True``,this module has learnable per-element affine parameters initializedto ones (for weights) and zeros (for biases). Defaults to True."""def __init__(self, num_channels: int, **kwargs) -> None:super().__init__(num_channels, **kwargs)self.num_channels = self.normalized_shape[0]def forward(self, x):assert x.dim() == 4, 'LayerNorm2d only supports inputs with shape ' \f'(N, C, H, W), but got tensor with shape {x.shape}'return F.layer_norm(x.permute(0, 2, 3, 1), self.normalized_shape, self.weight,self.bias, self.eps).permute(0, 3, 1, 2)

LayerNorm2d继承的nn.LayerNorm,在初始化时调用了父类的init函数,我们来看看父类是干了啥?

def __init__(self, normalized_shape: _shape_t, eps: float = 1e-5, elementwise_affine: bool = True,device=None, dtype=None) -> None:***self.normalized_shape = tuple(normalized_shape)

实际上这里仅仅是把num_channels,通道数,存入了self.normalized_shape,并且用一个tuple保存。
所以说,关键是forward里面的F.layer_norm

我们看看传入的参数
第一个参数是转置后的x,也就是N,C,H,W转置为N,H,W,C,把通道数放在最后一个维度,过F.layer_normnormalized_shape实际上就是前面init函数里传入的num_channels,就是一个数字。

接下来我们看看F.layer_norm的用法:
其实和nn.layernorm基本是一样的,只是不用事先实例化,这样的话参数要一起传进去。
对于nn.layernorm来说,

args:
normalized_shape (int or list or torch.Size): input shape from an expected input of size
If a single integer is used, it is treated as a singleton list, and this module willnormalize over the last dimension which is expected to be of that specific size.eps: a value added to the denominator for numerical stability. Default: 1e-5

上面这段话的意思就是说,这个normalized_shape可以是一个数,也可以是一个list,如果是一个数,则默认在最后一维归一化,且这个数需要等于最后一维的维度;如果是一个list,则这个list需要匹配从后往前的不同维度的维数
eg.

a.shape = (100. 96, 8, 8)#也就是100个96维的8x8的feature

如果是普通的layer norm,normalized_shape=[96, 8, 8]
如果这个参数是8,则在最后一维进行归一化
如果希望在所有point的channel归一化,如ConvNeXt
则先转置,把channel转到最后一维,然后normalized_shape=num_channel即可

那么ConvNeXt的layer norm如何改成普通的layer norm呢?
如代码所示:

class LayerNorm2d(nn.LayerNorm):def __init__(self, num_channels: int, **kwargs) -> None:super().__init__(num_channels, **kwargs)self.num_channels = self.normalized_shape[0]def forward(self, x):return F.layer_norm(x.permute(0, 2, 3, 1), self.normalized_shape, self.weight,self.bias, self.eps).permute(0, 3, 1, 2)

实际上只需要改forward里即可,即不转置,且normalized_shape参数传入x的最后三3维度

class LayerNorm2d(nn.LayerNorm):def __init__(self, num_channels: int, **kwargs) -> None:super().__init__(num_channels, **kwargs)self.num_channels = self.normalized_shape[0]def forward(self, x):return F.layer_norm(x, x.shape[1:], self.weight,self.bias, self.eps))

Layer Norm相关推荐

  1. Batch Norm、Layer Norm、Instance Norm、Group Norm、Switchable Norm总结

    转自https://blog.csdn.net/qq_41997920/article/details/89945972 目录 1.综述 1. BN 2. LN 3. IN 4. GN 5. SN 2 ...

  2. 详解常用的Batch Norm、Group Norm,Layer norm、Instance Norm

    本文主要分析cv中常用的batch norm, group norm方法,由于目标检测中不常见,因此只是简单介绍并理解Layer norm和Instance Norm的概念.首先cv中用的最多的肯定是 ...

  3. 一文弄懂Batch Norm / Layer Norm / Instance Norm / Group Norm 归一化方法

    文章目录 前因 总览 Batch Normalization Layer Normalization Instance Normalization Group Normalization 总结 参考 ...

  4. Group Norm,Batch Norm,Layer Norm

    Group Norm(GN).Batch Norm(BN)和Layer Norm(LN)都是常用的归一化方法,可以在深度学习中提升模型的训练效果. 区别与联系: BN是针对一个batch的数据进行归一 ...

  5. BERT用的LayerNorm可能不是你认为的那个Layer Norm?

    ©作者 | 王坤泽 单位 | 悉尼大学 研究方向 | NLP 有关 Batch norm 和 Layer norm 的比较可以算上是算法领域的八股文了,为什么 BERT 不用 batch norm 而 ...

  6. Batch Norm 与 Layer Norm

    这里写自定义目录标题 1 为何要对输入数据做 Normalization 2 Batch Normalization 3 Layer Normalization 4 实际应用 参考 1 为何要对输入数 ...

  7. 深度学习-各种归一化(Batch Norm、Layer Norm、Group Norm、InstanceNorm、Spatially-Adaptive Norm)

    深度学习之归一化:BN.LN.GN.IN.SPADE 0.总述 0.1.为什么要归一化处理 0.2.大体上看BN.LN.IN.GN 1.批量归一化(Batch Normalization,BN) 1. ...

  8. 40_pytorch Batch Norm

    1.37.Batch Normalization,批规范化 1.37.1.Batch Norm介绍 1.37.2.Intuitive explanation 1.37.3.Intuitive expl ...

  9. PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization

    PyTorch框架学习十八--Layer Normalization.Instance Normalization.Group Normalization 一.为什么要标准化? 二.BN.LN.IN. ...

  10. CV【5】:Layer normalization

    系列文章目录 Normalization 系列方法(一):CV[4]:Batch normalization Normalization 系列方法(二):CV[5]:Layer normalizati ...

最新文章

  1. OCA读书笔记(6) - 配置Oracle网络环境
  2. 九九乘法表Python+Java,你知道多少?
  3. SAP MM MD04中PR单据的显示
  4. 打造RIS服务器 软件在局域网中自动安装
  5. 使用mock解决测试中依赖第三方接口的问题
  6. menu什么意思中文意思_英文alone、lonely、lonesome 中文意思跟用法差别
  7. win10下最新MySQL8.0安装与环境配置,Navicat图形化管理工具连接,完整详细可收藏
  8. Arm学习总结之 32位和64位寄存器
  9. 厦门大学c语言上机答案,厦门大学C语言程序设计2016模拟题讲评及课程复习.pptx...
  10. c java 引用类型_java中的引用类型
  11. luogu4360 锯木厂选址 (斜率优化dp)
  12. EverMonkey-VSCode上最好用的印象笔记插件
  13. 正点原子DS100手持示波器测试记录
  14. 工作复盘_GRAI复盘法
  15. mysql 实现lead_MYSQL 代替lead()的寫法?
  16. (转载)使用Android Studio对代码进行重构
  17. 解决如何获取R的帮助文档
  18. mybatis countByExample Total: 1 返回 0
  19. 关于开源软件名字的由来
  20. 百度CEO李彦宏在毕业二十周年之际受邀重回母校

热门文章

  1. RFID技术实现汽车零部件与EDI自动连接
  2. python统计三国_如何用python对《三国演义》、《红楼梦》等名著开展词云分析及字频统计、出场统计等工作。...
  3. Scrapy框架 - Spiders
  4. 用树莓派搭建全功能NAS服务器(02):Docker用法下载机配置
  5. 安全管理实务之四:口令管理(转)
  6. Python学习笔记(5),Battleship 游戏
  7. php mongodb方法,PHP 操作mongodb api大部分方法
  8. TYVJ P1002 谁拿了最多奖学金 Label:模拟 水
  9. Redhat rpm常用命令以及如何配置yum软件仓库使用yum install
  10. Canvas: trying to use a recycled bitmap android.graphics.Bitmap