Layer Norm
参考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_norm
,normalized_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相关推荐
- 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 ...
- 详解常用的Batch Norm、Group Norm,Layer norm、Instance Norm
本文主要分析cv中常用的batch norm, group norm方法,由于目标检测中不常见,因此只是简单介绍并理解Layer norm和Instance Norm的概念.首先cv中用的最多的肯定是 ...
- 一文弄懂Batch Norm / Layer Norm / Instance Norm / Group Norm 归一化方法
文章目录 前因 总览 Batch Normalization Layer Normalization Instance Normalization Group Normalization 总结 参考 ...
- Group Norm,Batch Norm,Layer Norm
Group Norm(GN).Batch Norm(BN)和Layer Norm(LN)都是常用的归一化方法,可以在深度学习中提升模型的训练效果. 区别与联系: BN是针对一个batch的数据进行归一 ...
- BERT用的LayerNorm可能不是你认为的那个Layer Norm?
©作者 | 王坤泽 单位 | 悉尼大学 研究方向 | NLP 有关 Batch norm 和 Layer norm 的比较可以算上是算法领域的八股文了,为什么 BERT 不用 batch norm 而 ...
- Batch Norm 与 Layer Norm
这里写自定义目录标题 1 为何要对输入数据做 Normalization 2 Batch Normalization 3 Layer Normalization 4 实际应用 参考 1 为何要对输入数 ...
- 深度学习-各种归一化(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. ...
- 40_pytorch Batch Norm
1.37.Batch Normalization,批规范化 1.37.1.Batch Norm介绍 1.37.2.Intuitive explanation 1.37.3.Intuitive expl ...
- PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization
PyTorch框架学习十八--Layer Normalization.Instance Normalization.Group Normalization 一.为什么要标准化? 二.BN.LN.IN. ...
- CV【5】:Layer normalization
系列文章目录 Normalization 系列方法(一):CV[4]:Batch normalization Normalization 系列方法(二):CV[5]:Layer normalizati ...
最新文章
- OCA读书笔记(6) - 配置Oracle网络环境
- 九九乘法表Python+Java,你知道多少?
- SAP MM MD04中PR单据的显示
- 打造RIS服务器 软件在局域网中自动安装
- 使用mock解决测试中依赖第三方接口的问题
- menu什么意思中文意思_英文alone、lonely、lonesome 中文意思跟用法差别
- win10下最新MySQL8.0安装与环境配置,Navicat图形化管理工具连接,完整详细可收藏
- Arm学习总结之 32位和64位寄存器
- 厦门大学c语言上机答案,厦门大学C语言程序设计2016模拟题讲评及课程复习.pptx...
- c java 引用类型_java中的引用类型
- luogu4360 锯木厂选址 (斜率优化dp)
- EverMonkey-VSCode上最好用的印象笔记插件
- 正点原子DS100手持示波器测试记录
- 工作复盘_GRAI复盘法
- mysql 实现lead_MYSQL 代替lead()的寫法?
- (转载)使用Android Studio对代码进行重构
- 解决如何获取R的帮助文档
- mybatis countByExample Total: 1 返回 0
- 关于开源软件名字的由来
- 百度CEO李彦宏在毕业二十周年之际受邀重回母校
热门文章
- RFID技术实现汽车零部件与EDI自动连接
- python统计三国_如何用python对《三国演义》、《红楼梦》等名著开展词云分析及字频统计、出场统计等工作。...
- Scrapy框架 - Spiders
- 用树莓派搭建全功能NAS服务器(02):Docker用法下载机配置
- 安全管理实务之四:口令管理(转)
- Python学习笔记(5),Battleship 游戏
- php mongodb方法,PHP 操作mongodb api大部分方法
- TYVJ P1002 谁拿了最多奖学金 Label:模拟 水
- Redhat rpm常用命令以及如何配置yum软件仓库使用yum install
- Canvas: trying to use a recycled bitmap android.graphics.Bitmap