Dropout层的个人理解和具体使用

2023-10-27

一、Dropout层的作用

  dropout 能够避免过拟合,我们往往会在全连接层这类参数比较多的层中使用dropout;在训练包含dropout层的神经网络中,每个批次的训练数据都是随机选择,实质是训练了多个子神经网络,因为在不同的子网络中随机忽略的权重的位置不同,最后在测试的过程中,将这些小的子网络组合起来,类似一种投票的机制来作预测,有点类似于集成学习的感觉。

  关于dropout,有nn.Dropout和nn.functional.dropout两种。推荐使用nn.xxx,因为一般情况下只有训练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值。同时我们在用模型做预测的时候也应该声明model.eval()。

注⚠️:为了进一步加速模型的测试,我们可以设置with torch.no_grad(),主要是用于停止autograd模块的工作,以起到加速和节省显存的作用,具体行为就是停止梯度gradient计算和储存,从而节省了GPU算力和显存,但是并不会影响dropout和batchnorm层的行为,这样我们可以使用更大的batch进行测试。

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

二、Dropout层的使用方法

  以下是nn.Dropout和nn.functional.dropout两种具体的使用方法:

class Dropout1(nn.Module):
   def __init__(self):
       super(Dropout1, self).__init__()
       self.fc = nn.Linear(100,20)
 
   def forward(self, input):
       out = self.fc(input)
       out = F.dropout(out, p=0.5, training=self.training)  # 这里必须给traning设置为True
       return out
# 如果设置为F.dropout(out, p=0.5)实际上是没有任何用的, 因为它的training状态一直是默认值False. 由于F.dropout只是相当于引用的一个外部函数, 模型整体的training状态变化也不会引起F.dropout这个函数的training状态发生变化. 所以,在训练模式下out = F.dropout(out) 就是 out = out. 
Net = Dropout1()
Net.train()

#或者直接使用nn.Dropout() (nn.Dropout()实际上是对F.dropout的一个包装, 自动将self.training传入,两者没有本质的差别)
class Dropout2(nn.Module):
  def __init__(self):
      super(Dropout2, self).__init__()
      self.fc = nn.Linear(100,20)
      self.dropout = nn.Dropout(p=0.5)
 
  def forward(self, input):
      out = self.fc(input)
      out = self.dropout(out)
      return out
Net = Dropout2()
Net.train()
三、RNN中使用Dropout(进阶)

  偶然间我在一个项目中发现其在LSTM上下层连接的时候使用了dropout来控制模型的过拟合;通过我查阅了一些资料发现dropout只能用于特定的rnn连接上,在gru上边会出现错误,其具体的原因来自于模型的具体结构问题,具体详情可以参考:https://www.jianshu.com/p/be34e53d54e6

# https://github.com/allenai/allennlp/blob/master/allennlp/modules/input_variational_dropout.py
class RNNDropout(nn.Dropout):
    """
    Dropout layer for the inputs of RNNs.
    Apply the same dropout mask to all the elements of the same sequence in
    a batch of sequences of size (batch, sequences_length, embedding_dim).
    """

    def forward(self, sequences_batch):
        """
        Apply dropout to the input batch of sequences.
        Args:
            sequences_batch: A batch of sequences of vectors that will serve
                as input to an RNN.
                Tensor of size (batch, sequences_length, emebdding_dim).
        Returns:
            A new tensor on which dropout has been applied.
        """
        ones = sequences_batch.data.new_ones(sequences_batch.shape[0],
                                             sequences_batch.shape[-1])
        dropout_mask = nn.functional.dropout(ones, self.p, self.training,
                                             inplace=False)
        return dropout_mask.unsqueeze(1) * sequences_batch 
        # 这样就会随机mask掉词向量中的部分参数


以上是我对dropout的一些个人理解,欢迎大家补充或提出见解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dropout层的个人理解和具体使用 的相关文章

  • 2万字带你了解Selenium全攻略

    大家好 我是才哥 今天带大家一起学 复 习模拟浏览器运行的库Selenium 它是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE 7 8 9 10 11 Mozill
  • 堆的核心概述

  • 【Unity3D】笔记之OnGUI()下的自适屏

    转眼离上一篇博客的已有半年之久 想当初 满怀激情的说要坚持更新博客 记录学习笔记 但要真正坚持下去 确实需要非凡的毅力啊 脑子的那股热一散去整个人就懒了 还记得那时正准备写篇关于在OnGUI 方法下UI如何自动适应屏幕分辨率变化 但一直拖着
  • 蓝桥杯考前必看知识点【python 代码详解】

    文章目录 前言 一 基本知识点 1 基本输入输出 2 列表转字符串 3 字符串大小写转换 4 匿名函数lambda 5 二 八 十六进制 6 chr ord转换 7 保留小数点后几位 8 排序 二 python常用内置库模块 1 facto
  • “毕业1年,做Python挣了50W!”我摊牌了......

    现状揭秘 Python岗位大厂50K起 屠杀各种榜单 拿下语言排行榜的Python 薪酬真的如同网传开挂了吗 笔者在脉脉上发现了这样的一个信息 但Python真的这么火 笔者准备去全网帮你们 打探 一下 让大家了解真实的Python市场 数
  • h5+js调取相机做取景框_uni-app 2.2发布,大幅优化H5端性能体验

    背景 uni app发布以来 已经服务了几十万开发者 让我们意外 或者说惊喜的是 有大量开发者用uni app只编写H5版 并没有多端发布 可参考案例 这其实也符合uni app的初衷 uni app的定位并不是需要多端发布时才用uni a

随机推荐

  • Electron-日志与崩溃收集

    概述 对于任何的客户端应用 开发者都希望能够在用户上的手上记录下相关信息以便了解真实的使用情况 一般情况下 分为以下两种信息 正常日志 在不涉及隐私的情况下 让开发者了解用户使用客户端的详细情况 从这些情况中提炼的信息能够让开发者根据用户的
  • linux自动补全命令

    CentOS6 5安装Tab增强版 bash completion 可补全命令参数 因为CentOS官方源并不带有bash completion的包 所以 为了可用yum安装 增加epel的源 首先 使用wget下载epel的rpm包 使用
  • ELK-定期清除数据

    bin bash Author richard Date 2017 08 11 17 27 49 Last Modified by richard Last Modified time 2017 08 11 18 04 58 保留近 N 天
  • samba服务器经windows共享后虚拟机中文件权限nobody,nogroup

    前几天想共享文件到虚拟机的ubuntu结果新建的网络映射一会能看到共享文件夹但无打开权限一会直接连接不上 毕竟是新手只能百度试了病急乱投医N种方法仍然不能解决对于有强迫症的我弄了将近2个多小时依然没有解决于是 恼羞成怒 吧samba的程序卸
  • 带刻度尺的日期选择器

    带刻度尺的日期选择器 1 概述 2 试着使用UIPickerView实现 3 使用UICollectionView实现 1 获取一年12个月的数据 2 滚动到1月1号和12月31号的时候如何能够无缝的显示 4 模糊 渐变 写在前面的话 最近
  • NodeMcu arduino编程环境搭建(Esp8266开发环境搭建)

    物联网模块 先入手了有一个ESP8266 用到那个学习那个 后面开始Node mcu一边学习一边内容更新了 1 先下载arduino编译器 资料链接 链接 https pan baidu com s 18xPtm47pjUvObBd6Veh
  • 第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)

    目录 试题 A 日期统计 1 题目描述 2 解题思路 3 模板代码 试题 B 01 串的熵 1 题目描述 2 解题思路 3 模板代码 试题 C 冶炼金属 1 题目描述 2 解题思路 3 模板代码 试题 D 飞机降落 1 题目描述 2 解题思
  • No implementation found for void com.wust.testjni10.CallJava.callPrintString()

    问题描述 当你看到这篇文章的时候 说明你会jni了 并且还在调用 so 库 可问题就出在调用的时候报了这么个错 No implementation found for void com wust testjni10 CallJava cal
  • uniapp-提现功能(demo)

    页面布局 提现页面 有一个输入框 一个提现按钮 一段提现全部的文字 首先用v model 和data内的数据双向绑定 输入框逻辑分析 输入框的逻辑 为了符合日常输出 所以要对输入框加一些条件限制 因为是提现 所以对输入的字符做筛选 只允许出
  • 由于某种原因,PowerPoint 无法加载MathType..... (亲测有效)

    网上找了较多的参考解决办法 最后发现如下博主提供的方法快捷有效 https blog csdn net dss875914213 article details 85873938 问题 PPT打开时弹出由于某种原因powerpoint无法加
  • 关于python

    1 关于python Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计 作为一门叫做ABC语言的替代品 Python提供了高效的高级数据结构 还能简单有效地面向对象编程 Python语法和
  • Viva Workplace Analytics & Employee Feedback SU Viva Glint部署方案

    目录 一 Viva Workplace Analytics Employee Feedback SU Viva Glint介绍 二 Viva Glint和Viva Pulse特点和优势 1 简单易用
  • SLAM精度评定工具——EVO使用方法详解

    系统版本 Ubuntu20 04 ROS版本 Noetic EVO是用于处理 评估和比较里程计和SLAM算法的轨迹输出的工具 注意 本文的评测是在kitti数据集下进行评测 其他的数据集也支持评测 安装EVO 可以执行下面这条命令 pip
  • Pytorch 中如何对训练数据进行增强处理?

    假设我们的数据集是一个手写数字的图像数据集 其中每一张图像包含一个手写数字和对应的标签 我们可以通过随机旋转 平移 缩放和翻转等操作 对原始的图像进行变换增广 Data Augmentation 以增强模型的训练效果 举个例子 我们可以通过
  • JavaScript 实现数组中的字符串按长度排序,长度一样按字母顺序排序

    以下的newar数组里的val键值排序要求 字串按长度排序 长度一样按字母顺序排序 js实现数组中的字符串按长度排序 长度一样按字母顺序排序 function sortByLenByazAZVal array array sort a b
  • MYSQL之ON DUPLICATE KEY UPDATE使用

    创建表 DROP TABLE IF EXISTS user CREATE TABLE user id int 32 NOT NULL AUTO INCREMENT COMMENT 主键id userName varchar 32 NOT N
  • 【单片机毕业设计】【mcuclub-dz-055】基于单片机的智能手环控制系统设计

    最近设计了一个项目基于单片机的智能智能手环控制系统设计 与大家分享一下 一 基本介绍 项目名 智能手环 项目编号 mcuclub dz 055 单片机类型 STM32F103C8T6 具体功能 1 通过MAX30102测量心率 血氧 2 通
  • PFQ,适用于多核处理器系统中的网络监控框架

    PFQ 是一个支持多语言的网络框架 主要用于 Linux 操作系统下进行高效的包捕获和传输 适用于多核处理器系统中的网络监控框架 PFQ 专门为多核处理器而优化 包括对多个硬件队列的网络设备优化 支持任意网络设备驱动 并提供一个脚本用来加速
  • 动态内存与静态内存的区别

    1 静态内存 静态内存是指在程序开始运行时由编译器分配的内存 它的分配是在程序开始编译时完成的 不占用CPU资源 程序中的各种变量 在编译时系统已经为其分配了所需的内存空间 当该变量在作用域内使用完毕时 系统会 自动释放所占用的内存空间 变
  • Dropout层的个人理解和具体使用

    一 Dropout层的作用 dropout 能够避免过拟合 我们往往会在全连接层这类参数比较多的层中使用dropout 在训练包含dropout层的神经网络中 每个批次的训练数据都是随机选择 实质是训练了多个子神经网络 因为在不同的子网络中