【Pytorch】BatchNorm2d()函数和Dropout层的位置和使用

【Pytorch】BatchNorm2d函数和Dropout层

记录一下关于这些层在神经网路的位置以及应用情况

BatchNorm2d()函数

作用

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

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

位置和使用

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

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

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

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

【Pytorch】BatchNorm2d()函数和Dropout层的位置和使用
在pytorch中的函数原型:
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.Dropout和nn.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.

Original: https://blog.csdn.net/ethan18/article/details/122667820
Author: ethanyi9
Title: 【Pytorch】BatchNorm2d()函数和Dropout层的位置和使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/709364/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球