pytorch的归一化层

原理

归一化公式:
y=x−E[x]Var[x]+ϵ∗γ+βy=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon}}*\gamma + \betay=Var[x]+ϵxE[x]γ+β

其中:

  • E[x]E[x]E[x] 是向量 xxx 的均值
  • Var[x]Var[x]Var[x] 是向量 xxx 的方差
  • ϵ\epsilonϵ 常数,通常等于 0.000010.000010.00001,防止分母为 0
  • γ\gammaγ 用于仿射变换
  • β\betaβ 用于仿射变换

本文介绍的 4 种归一化主要是针对的维度不同,例如 BatchNorm 是对所有 banch 的单个通道归一化,每个通道的归一化独立,而 GroupNorm 是一个 banch 下的通道分组归一化,不受 banch size 的影响,如下图:

请添加图片描述

1 BatchNorm

BN 是对所有 banch 的单个通道做归一化,每个通道都分别做一次。

# 这里只示例 2d 的,针对常用的卷积维度
torch.nn.BatchNorm2d(num_features, eps=1e-5, momentum=0.1,\
                     affine=True, track_running_stats=True)

成员变量:

  • num_features:通道数。
  • eps:常数 ϵ\epsilonϵ
  • momentum:动量参数,用来控制 running_mean 和 running_var 的更新,更新方法:Mnew=(1−m)∗Mold+m∗meanM_{new}=(1-m)*M_{old}+m*meanMnew=(1m)Mold+mmean,其中,MnewM_{new}Mnew 是最新的 running_mean,MoldM_{old}Mold 是上一次的 running_mean,meanmeanmean 是当前批数据的均值。
  • affine:仿射变换的开关
    • 如果 affine=False,则 γ=1\gamma=1γ=1β=0\beta=0β=0,且不能学习;(对应weight、bias变量)
    • 如果 affine=True,则 γ\gammaγβ\betaβ 可以学习;
  • training:训练状态或测试状态,两种状态下运行逻辑不通。
  • track_running_stats:如果为 True,则统计跟踪 batch 的个数,记录在 num_batches_tracked 中。
  • num_btaches_tracked:跟踪 batch 的个数。

trainning 和 tracking_running_stats 有 4 种组合:

trainningtracking_running_stats说明
TrueTrue正常的训练过程,跟踪整个训练过程的 banch 特性
TrueFalse不跟踪训练过程的 banch 特性,只计算当前的 banch 统计特性
FalseTrue使用之前训练好的 running_mean、running_var,且不会更新
FalseFalse(一般不采用)只计算当前特征

更新过程:

  • running_mean、running_var 是在 forward 过程中更新的,记录在 buffer 中。(反向传播部影响)
  • γ\gammaγβ\betaβ 是在反向传播中学习得到的。
  • model.eval() 可以固定住 running_mean、running_var。

2 GroupNorm

torch.nn.GroupNorm(num_groups, num_channels, eps=1e-5, affine=True)

3 InstanceNorm

torch.nn.InstanceNorm2d(num_features, eps=1e-5, momentum=0.1, affine=False, track_running_stats=False)

4 LayerNorm

torch.nn.LayerNorm(normalized_shape, eps=1e-5, elementwise_affine=True)

参考上面的原理图,LayerNorm 是对一个 banch 的所有通道做归一化,如果输入的 tensor 维度为 [4,6,3,3][4,6,3,3][4,6,3,3],那么函数的传参 normalized_shape 就是 [6,3,3][6,3,3][6,3,3]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值