pytorch中nn.BatchNorm2d函数的使用

作用

机器学习中,进行模型训练之前,需对数据做归一化处理,使其分布一致。在深度神经网络训练过程中,通常一次训练是一个batch,而非全体数据。在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难。BatcNormalization强行将数据拉回到均值为0,方差为1的正太分布上,一方面使得数据分布一致,另一方面避免梯度消失

class torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)

num_features: 一般输入参数为batch_sizenum_featuresheight*width,即为其中特征的数量(输入神经网络的通道数)。

eps: 保证数值稳定性,分母不能为零,默认为1e-5。

momentum: 动态均值和动态方差所使用的动量,即一个用于运行过程中均值和方差的一个估计参数,默认值为0.1。

affine: 一个布尔值,当设为true,给该层添加可学习的仿射变换参数,即给定可以学习的系数矩阵 gamma和beta。其中的affine指定是否需要仿射,也就是是否需要上面算式的第四个,如果affine=False则γ=1,β=0,并且不能学习被更新。一般都会设置成affine=True。

数学公式

BatchNorm2d()函数数学原理如下:

在这里插入图片描述

在对小批量数据计算时,其中x为需要归一化的输入数据,mean(x)和Var(x)为批量数据的均值和方差,eps为防止分母出现零所增加的变量,gamma 和beta是可学习的参数向量(在【0,1】范围)

代码理解

对于一批数据,需要计算各个维度上的均值和标准差,一批数据有几个维度,就有几个均值,一批数据N×C×W×H(64,16,256,858),均值有16个

 Y = nn.BatchNorm2d(16,affine=True) 
 input = torch.randn(64,16,256,858)
 output = Y(input)
 print(Y)
 print(output)

更详细的参考链接

你可能感兴趣的:(CNN,python,深度学习,神经网络)