本篇博客主要讲解BatchNorm函数的执行过程,需要读者有一定的批归一化的基础,本文例子通俗易懂,如果没有基础也可以阅读
在PyTorch中BatchNorm有三个函数,这里主要讲解前两个,后面的就很容易理解,首先要明白批归一化是做什么的:BatchNorm在深度网络中用来加速神经网络的训练,能够加速收敛并且可以使用较大的学习率,同时归一化还有一定的正则作用
torch.nn.BatchNorm1d
torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, device=None, dtype=None)
归一化的结果如下所示:
y=x−E[x]Var[x]+ϵ∗γ+β y = \frac{x-E[x]}{\sqrt{Var[x]+\epsilon}}*\gamma + \beta y=Var[x]+ϵx−E[x]∗γ+β
其中E[x]E[x]E[x]为样本某一维的均值,Var[x]Var[x]Var[x]为样本某一维的方差,注意这里计算方差的时候使用的是有偏估计,对应的函数为torch.var(input, unbiased=False),什么意思呢,就是说计算方差的时候分母为NNN而不是N−1N-1N−1,即Var[x]=1N∑i=1N(xi−x‾)Var[x] = \frac{1}{N}\sum_{i=1}^{N} (x_{i}-\overline x)Var[x]=N1∑i=1N(xi−x)
- num_features:输入样本的特征数
- eps:避免归一化时分母为0
- momentum:用来计算running_mean和running_var的一个量
- affine:是否进行缩放平移
- track_running_stats:是否统计全局的running_mean和running_var
下面通过一个例子来详细介绍各个参数的作用
对于一维数据如下所示,每一行对应的是每一个batch,每一列是这个batch对应的数据维度,比如第一行第一列是第一个batch的第一维数据,第二列是第一个batch的第二维数据,以此类推。我们在批归一化的时候就是对不同patch的相同维度进行的,比如这里就是A1,B1,C1,D1...
1. 初始化
下面我们将nn.BatchNorm1d(2, affine=False)中的affine有的设为了True,有的设为了False,这里默认为True,就是说对于上面公式中的γ和β\gamma和\betaγ和β我们是要学习的,在BatchNorm中他们的参数分别为batch.weight以及batch.bias,默认为1和0,之后通过学习反向传播时会发生变化
torch.manual_seed(1)
m = nn.BatchNorm1d(2) # With Learnable Parameters
n = nn.BatchNorm1d(2, affine=False) # Without Learnable Parameters
'''
----------------- m -------------------
m: BatchNorm1d(2, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
m.weight.data: tensor([1., 1.])
m.bias.data: tensor([0., 0.])
m.weight.requires_grad: True
m.bias.requires_grad: True # 这里的weight和bias对应上面的gamma和beta
----------------- n -------------------
n: BatchNorm1d(2, eps=1e-05, mo

本文详细解读了PyTorch中的BatchNorm1d函数,包括其用于加速深度学习训练的原理,参数设置如num_features、eps、momentum的作用,以及手动计算均值、方差与归一化的步骤。通过实例演示了affine参数对输出的影响,并深入探讨了running_mean和running_var在训练与测试中的运用。
最低0.47元/天 解锁文章
6214





