nn.Dropout、DropPath的理解与pytorch代码

这篇具有很好参考价值的文章主要介绍了nn.Dropout、DropPath的理解与pytorch代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


​在vit的代码中看到了DropPath,想知道DropPath与nn.Dropout()有什么区别,于是查阅相关资料记录一下。

理论

dropout

​dropout是最早的用于解决过拟合的方法,是所有drop类方法的大前辈。dropout在12年被Hinton提出,并且在《ImageNet Classification with Deep Convolutional Neural Network》工作AlexNet中使用到了dropout。

原理 :在前向传播的时候,让某个神经元激活以概率1-keep_prob(0<p<1)停止工作。

功能 : 这样可以让模型泛化能力更强,因为其不会过于依赖某些局部的节点。训练阶段以keep_prob的概率保留,以1-keep_prob的概率关闭;测试阶段所有的神经元都不关闭,但是对训练阶段应用了dropout的神经元,输出值需要乘以keep_prob。

注意:dropout现在一般用于全连接层。卷积层一般不使用Dropout,而是使用BN来防止过拟合,而且卷积核还会有relu等非线性函数,降低特征直接的关联性。

DropPath

​DropPath于论文《FractalNet: Ultra-Deep Neural Networks without Residuals(ICLR2017)》中与FractalNet一起提出。

原理 :字如其名,DropPath将深度学习网络中的多分支结构随机删除。

功能 :一般可以作为正则化手段加入网络,但是会增加网络训练的难度。尤其是在NAS问题中,如果设置的drop_prob过高,模型甚至有可能不收敛。

代码

import torch
import torch.nn as nn


def drop_path(x, drop_prob: float = 0., training: bool = False):
    if drop_prob == 0. or not training:  # drop_prob废弃率=0,或者不是训练的时候,就保持原来不变
        return x
    keep_prob = 1 - drop_prob  # 保持率
    shape = (x.shape[0],) + (1,) * (x.ndim - 1)  # (b, 1, 1, 1) 元组  ndim 表示几维,图像为4维
    random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device)  # 0-1之间的均匀分布[2,1,1,1]
    random_tensor.floor_()  # 下取整从而确定保存哪些样本 总共有batch个数
    output = x.div(keep_prob) * random_tensor  # 除以 keep_prob 是为了让训练和测试时的期望保持一致
    # 如果keep,则特征值除以 keep_prob;如果drop,则特征值为0
    return output  # 与x的shape保持不变


class DropPath(nn.Module):
    def __init__(self, drop_prob=None):
        super(DropPath, self).__init__()
        self.drop_prob = drop_prob

    def forward(self, x):
        return drop_path(x, self.drop_prob, self.training)

if __name__ == '__main__':
    input = torch.randn(3, 2, 2, 3)
    drop1 = DropPath(drop_prob=0.4)  # 实例化
    drop2 = nn.Dropout(p=0.4)
    out1 = drop1(input)
    out2 = drop2(input)
    print(input)
    print(out1)
    print(out2)
    print(out1.shape, out2.shape)     

​结果如下:

tensor([[[[-0.4603, -0.2193,  0.7828],   # 这是input
          [-0.4790, -0.3336,  1.3353]],

         [[-0.4309, -0.6019, -0.4993],
          [ 0.2313,  0.7210, -0.2553]]],


        [[[ 0.0653, -0.4787,  0.6238],
          [ 1.4323,  1.0883, -0.6952]],

         [[ 0.0912,  0.8802, -0.6991],
          [ 0.7248, -0.9305,  0.2832]]],


        [[[ 0.0923,  0.4770,  0.5671],
          [ 1.2669,  0.4013,  0.3464]],

         [[ 0.8646, -0.3866, -0.8333],
          [-1.1507,  1.4823,  0.1255]]]])
tensor([[[[-0.7672, -0.3655,  1.3047],  # 这是DropPath
          [-0.7984, -0.5560,  2.2255]],

         [[-0.7181, -1.0032, -0.8322],
          [ 0.3855,  1.2016, -0.4255]]],


        [[[ 0.0000, -0.0000,  0.0000],
          [ 0.0000,  0.0000, -0.0000]],

         [[ 0.0000,  0.0000, -0.0000],
          [ 0.0000, -0.0000,  0.0000]]],


        [[[ 0.1539,  0.7949,  0.9452],
          [ 2.1115,  0.6688,  0.5773]],

         [[ 1.4411, -0.6444, -1.3888],
          [-1.9179,  2.4706,  0.2092]]]])
tensor([[[[-0.7672, -0.0000,  0.0000],  # 这是nn.Dropout
          [-0.7984, -0.5560,  2.2255]],

         [[-0.0000, -1.0032, -0.8322],
          [ 0.0000,  1.2016, -0.4255]]],


        [[[ 0.0000, -0.7979,  1.0397],
          [ 2.3872,  0.0000, -0.0000]],

         [[ 0.0000,  0.0000, -1.1652],
          [ 0.0000, -1.5509,  0.4720]]],


        [[[ 0.1539,  0.0000,  0.9452],
          [ 2.1115,  0.0000,  0.5773]],

         [[ 1.4411, -0.6444, -1.3888],
          [-1.9179,  0.0000,  0.0000]]]])
torch.Size([3, 2, 2, 3]) torch.Size([3, 2, 2, 3])

我们看input第一个数是-0.4603,keep_prob是1-drop_prob=0.6,-0.4603/0.6=-0.7672,而两个out中的第一个数均为-0.7672,说明两种方法均有把保留的数值除以keep_prob。

​此外,可以看到,DropPath的输出中,是随机将一个batch中所有的神经元均设置为0。而在dropout中,是每个batch中随机选择概率为p的神经元设置为0。下面展示在两个输出中的一个batch的结果,看一下区别:

nn.dropout,pytorch,人工智能

​补充一下DropPath在vit中的调用:

self.drop_path = DropPath(drop_path_ratio) if drop_path_ratio > 0. else nn.Identity()

x = x + self.drop_path(self.attn(self.norm1(x)))
x = x + self.drop_path(self.mlp(self.norm2(x)))

问题:dropout中为什么要除以 keep_prob?

​为了保证使用dropout的神经元输出激活值的期望值与不使用时一致,结合概率论的知识来具体看一下:假设一个神经元的输出激活值为 a a a。在不使用drop_path的情况下,其输出期望值为 a a a。如果使用了drop_path,神经元就可能有保留和关闭两种状态,把它看作一个离散型随机变量,它就符合概率论中的0-1分布,其输出激活值的期望变为 p ∗ a + ( 1 − p ) ∗ 0 = p a p*a+(1-p)*0=pa pa+(1p)0=pa,此时若要保持期望与不使用drop_path时一致,就需要除以 p p p

参考资料:

https://www.cnblogs.com/dan-baishucaizi/p/14703263.html#bottom
https://www.cnblogs.com/pprp/p/14815168.html
https://blog.csdn.net/weixin_54338498/article/details/125670154
https://blog.csdn.net/wuli_xin/article/details/127266407文章来源地址https://www.toymoban.com/news/detail-621022.html

到了这里,关于nn.Dropout、DropPath的理解与pytorch代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Pytorch各种Dropout层应用于详解

    目录 torch框架Dropout functions详解 dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例 alpha_dropout 用途 用法 使用技巧 参数 数学理论公式 代码示例  feature_alpha_dropout 用途 用法 使用技巧 参数 数学理论 代码示例 dropout1d 用途 用法 使用技巧 参数 数学理论 代码示例 dropout2d 用

    2024年01月21日
    浏览(40)
  • 深入理解深度学习——正则化(Regularization):Dropout

    分类目录:《深入理解深度学习》总目录 Dropout供了正则化一大类模型的方法,计算方便且功能强大。在第一种近似下,Dropout可以被认为是集成大量深层神经网络的实用Bagging方法。Bagging涉及训练多个模型,并在每个测试样本上评估多个模型。当每个模型都是一个很大的神经

    2024年02月09日
    浏览(39)
  • pytorch10:正则化(weight_decay、dropout、Batch Normalization)

    往期回顾 pytorch01:概念、张量操作、线性回归与逻辑回归 pytorch02:数据读取DataLoader与Dataset、数据预处理transform pytorch03:transforms常见数据增强操作 pytorch04:网络模型创建 pytorch05:卷积、池化、激活 pytorch06:权重初始化 pytorch07:损失函数与优化器 pytorch08:学习率调整策略

    2024年02月01日
    浏览(60)
  • Pytorch学习笔记(8):正则化(L1、L2、Dropout)与归一化(BN、LN、IN、GN)

     一、正则化之weight_decay(L2正则) 1.1 正则化及相关概念 1.2 正则化策略(L1、L2) (1)L1正则化 (2)L2正则化 1.3 L2正则项——weight_decay 二、正则化之Dropout 2.1 Dropout概念 2.2 nn.Dropout  三、归一化之Batch Normalization(BN层) 3.1 Batch Normalization介绍 3.2 Pytorch的Batch Normalization 1d

    2024年02月04日
    浏览(43)
  • 机器学习&&深度学习——Dropout

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——权重衰减 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 当面对更多特征而样本不足时,线性模型常会过拟合。而如果给出更多的样本而不是特征,通常线性模型不

    2024年02月15日
    浏览(40)
  • Dropout原理及作用

            Dropout是作为缓解卷积神经网络CNN过拟合而被提出的一种正则化方法,它确实能够有效缓解过拟合现象的发生,但是Dropout带来的缺点就是可能会减缓模型收敛的速度,因为每次迭代只有一部分参数更新,可能导致梯度下降变慢。        Dropout叫做随机失活,简单来

    2024年02月05日
    浏览(35)
  • dropout层简介

    Dropout层在神经网络层当中是用来干嘛的呢?它是一种可以用于减少神经网络过拟合的结构,那么它具体是怎么实现的呢? 假设下图是我们用来训练的原始神经网络: 一共有四个输入x_i,一个输出y。Dropout则是在每一个batch的训练当中随机减掉一些神经元,而作为编程者,我们

    2024年02月15日
    浏览(33)
  • 13 Dropout(丢弃法)

    正则项只在训练时使用,他们在更新权重时让模型复杂度降低一点点, dropout正则项方法之一,深度学习崛起前,最早提出的算法。 动机:一个好的模型,需要对你的输入数据鲁棒,无论加入多少噪音都有稳定的输出 使用有噪音的数据等价于一个正则,这个是随机噪音 丢弃

    2024年02月10日
    浏览(33)
  • 深度学习——过拟合和Dropout

    过拟合(Overfitting)是机器学习和深度学习中常见的问题之一,它指的是模型在训练数据上表现得很好,但在未见过的新数据上表现较差的现象。 当一个模型过度地学习了训练数据的细节和噪声,而忽略了数据中的一般规律和模式时,就会发生过拟合。过拟合是由于模型过于

    2024年02月16日
    浏览(39)
  • 【动手学深度学习】--06.暂退法Dropout

    学习视频:丢弃法【动手学深度学习v2】 官方笔记:暂退法(Dropout) 1.1动机 丢弃法其实是一个正则 1.2无偏差的加入噪音 1.3使用丢弃法 1.4推理中的丢弃法 总结: 丢弃法将一些输出项随机置0来控制模型复杂度 常作用在多层感知机的隐藏层输出上 丢弃概率是控制模型复杂度

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包