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

文章目录

  • 理论
    • dropout
    • DropPath
  • 代码
  • 问题:dropout中为什么要除以 keep_prob?

​在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 nndef drop_path(x, drop_prob: float = 0., training: bool = False):if drop_prob == 0. or not training:  # drop_prob废弃率=0,或者不是训练的时候,就保持原来不变return xkeep_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,则特征值为0return output  # 与x的shape保持不变class DropPath(nn.Module):def __init__(self, drop_prob=None):super(DropPath, self).__init__()self.drop_prob = drop_probdef 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的结果,看一下区别:

img

​补充一下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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/317287.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KBDPL.DLL文件丢失,软件游戏无法启动,修复方法

不少小伙伴&#xff0c;求助说遇到Windows弹窗提示“KBDPL.DLL文件丢失&#xff0c;应用无法启动的问题”&#xff0c;不知道应该怎么修复&#xff1f; 首先&#xff0c;先来了解“KBDPL.DLL文件”是什么&#xff1f; kbdpl.dll是Windows操作系统的一部分&#xff0c;是一个动…

vue3 基础+进阶(三、项目篇:状态管理库、路由以及一些基本配置)

目录 第三章 状态管理库:Pinia 3.1 创建空Vue项目并安装Pinia 3.1.1 创建空Vue项目 3.1.2 安装Pinia以及持久化工具 3.2 使用pinia 3.1.1 使用案例 3.1.2 规范问题 3.1.3 简化&#xff1a;结构赋值 第四章 Vue3的Router路由理解&#xff08;与vue2类比&#xff09; …

DHCP定义

DHCP&#xff08;动态主机配置协议&#xff09;是一个局域网的网络协议。指的是由服务器控制一段IP地址范围&#xff0c;客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。默认情况下&#xff0c;DHCP作为Windows Server的一个服务组件不会被系统自动安装&#…

关于标准那些事——第六篇 四象之“朱雀”(要素的表述)

两仪生四象——东方青龙&#xff08;木&#xff09;、西方白虎&#xff08;金&#xff09;、南方朱雀&#xff08;火&#xff09;、北方玄武&#xff08;水&#xff09; 分别对应标准编写之四象——层次的编写、要素的编写、要素的表述、格式的编排。 今天来分享一下 要素的表…

Java项目:106SpringBoot理财管理系统(含论文)

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 理财管理系统基于SpringBootMybatis开发&#xff0c;功能完整&#xff0c;页面简洁&#xff0c;系统分为管理员和普通用户两种角色。 管理员功能如下&…

kbdnso.dll文件缺失,软件或游戏报错的快速修复方法

很多小伙伴遇到电脑报错&#xff0c;提示“kbdnso.dll文件缺失&#xff0c;程序无法启动执行”时&#xff0c;不知道应该怎样处理&#xff0c;还以为是程序出现了问题&#xff0c;想卸载重装。 首先&#xff0c;先要了解“kbdnso.dll文件”是什么&#xff1f; kbdnso.dll是Win…

java数据结构与算法刷题-----LeetCode70. 爬楼梯

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

今天用vite新建的vue3的项目 启动遇到报错

UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token ??at Loader.moduleStrategy (internal/modules/esm/translators.js:145:18) (Use node --trace-warnings ... to show where the warning was created) (node:30304) UnhandledPromiseRejectionWarning: U…

MACOS Atrust服务异常

MAC版Atrust服务异常 点击进入办公后出现提示其一&#xff1a; 核心服务未启动&#xff0c;部分功能存在异常&#xff0c;确定重新启动吗&#xff1f; 可能的原因&#xff1a; 1.上次已完全退出客户端 2.核心服务被其他程序优化禁用 点击重新启动后&#xff0c;出现提示&#x…

HTTP 错误 401.3 - Unauthorized 由于Web服务器上此资源的访问控制列表(ACL)配置或加密设置。

用IIS 发布网站&#xff0c;不能访问且出现错误&#xff1a; HTTP 错误 401.3 - Unauthorized 由于Web服务器上此资源的访问控制列表(ACL)配置或加密设置。您无权查看此目录或页面 解决办法&#xff1a; 1.打开IIS界面&#xff0c;选中发布的网站&#xff0c;右键—>编辑…

如何做一个炫酷的Github个人简介(3DContribution)

文章目录 前言3D-Contrib第一步第二步第三步第四步第五步第六步 前言 最近放假了&#xff0c;毕设目前也不太想做&#xff0c;先搞一点小玩意玩玩&#xff0c;让自己的github看起来好看点。也顺便学学这个action是怎么个事。 3D-Contrib 先给大家看一下效果 我的个人主页&am…

全球进出口贸易数据查询_箱讯科技助力全球数字贸易发展

企业家应该选择合适的出口产品&#xff0c;因为选择合适的出口产品对于出口业务的成功至关重要。可以在考虑各种因素的基础上进行选择。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 一、出口趋势 计划从事外贸出口的企业家可以通过分析出口趋势&…