有些时候在跑神经网络模型的时候发现有很多专业名词和函数老是记不清,所以想在这里整理一下,方便归纳。

函数

BatchNorm2d()函数

作用

BatchNorm2d归一化,就是指使用BatchNorm2d函数来进行

它的目的是使得数据在进行Relu之前不会因为数据过大而导致网络性能的不稳定

位置和使用

在神经网络中每一次卷积基本都包含了3个步骤:

  • conv卷积层
  • BatchNorm2d归一化
  • ReLU或者其他激活函数

其中卷积就是直接卷积,大家应该都知道

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

在pytorch中的函数原型:

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

其中的参数是:

1.num_features:一般输入参数为输入数据的特征通道数,也就是一个 [batch_size, in_channels, height, width]中的in_channels张量,即为其中特征的数量,

2.eps:分母中添加的一个值,目的是为了计算的稳定性,默认为:1e-5

3.momentum:一个用于运行过程中均值和方差的一个估计参数(就是一个惯性吧应该)

4.affine:当设为true时,会给定可以学习的系数矩阵gamma和beta

Dropout函数

作用

Dropout 能够避免过拟合,我们往往会在全连接层这类参数比较多的层中使用dropout

在训练包含Dropout层的神经网络中,每个批次的训练数据都是随机选择,实质是训练了多个子神经网络。

因为在不同的子网络中随机忽略的权重的位置不同,最后在测试的过程中,将这些小的子网络组合起来,类似一种投票的机制来作预测,有点类似于集成学习的感觉。

位置

一般就放在全连接层前面,用来随机简化一下全连接层,降低一下GPU的压力

使用

在pytorch中有nn.Dropoutnn.functional.dropout两种。

推荐使用nn.Dropout,因为一般情况下只有训练train时才用dropout,在eval不需要dropout。

使用nn.Dropout,在调用model.eval()后,模型的Dropout层和批归一化(batchnorm)都关闭,但用nn.functional.dropout,在没有设置training模式下调用model.eval()后不会关闭Dropout。

这里关闭Dropout等的目的是为了测试我们训练好的网络。

在eval模式下,Dropout层会让所有的激活单元都通过,而batchnorm层会停止计算和更新mean和var,直接使用在train训练阶段已经学出的mean和var值。

with torch.no_grad()

停止掉autograd模块的工作,意思是这个时候就不会计算梯度和进行优化了,也不会储存梯度,一般就是验证和测试的时候用

model.eval()

  • 对于BatchNorm,model.eval()是保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变。
  • 对于Dropout,model.eval()是利用到了所有网络连接,即不进行随机舍弃神经元。

参考:

https://blog.csdn.net/qq_42346574/article/details/119895908.
https://www.bilibili.com/video/BV1DM4y1w7J4.