【深度学习】03-神经网络 4-1 Dropout 正则化 - 神经网络缓解过拟合的正则化方法

参数更新,只是更新一部分,剩下的部分,是进行缩放。即分数会扩大。

Dropout 正则化是一种深度学习中常用的正则化技术,最早由 Geoffrey Hinton 等人在 2012 年提出,旨在防止神经网络的过拟合

1. 来源

Dropout 是由 Hinton 和他的团队在论文《Improving neural networks by preventing co-adaptation of feature detectors》中首次提出。该技术的灵感来自于生物学中神经元随机失活的现象,用于模拟随机神经元的失效,增强网络的鲁棒性。

2. 作用

Dropout 的核心思想是在每次训练过程中,随机“丢弃”一部分神经元(即将这些神经元的输出设为 0),使得模型不能过度依赖某些特定的神经元。这一过程可以理解为在训练过程中构建了多个不同的子模型,然后在测试时将这些子模型的输出进行平均。

  • 防止过拟合:通过随机失活神经元,减少了神经元之间的依赖,防止模型过度拟合训练数据,提高了模型的泛化能力。

  • 提高模型鲁棒性:Dropout 迫使模型中的神经元学会独立地进行工作,因为每个神经元不能保证在每次训练中都被激活。

3. 工作机制

在训练过程中,每个神经元以一定的概率(通常为 0.5)被暂时“丢弃”。在推理(即测试)阶段,不再丢弃任何神经元,而是对所有神经元的输出进行缩放,通常是将每个神经元的输出乘以丢弃概率的补值。例如,如果训练时 50% 的神经元被丢弃,测试时就将所有神经元的输出乘以 0.5,以保持训练和测试时的期望输出一致。

4. 优势

  • 简单高效:只需在前向传播时随机丢弃神经元,且不需要额外的计算资源。

  • 提升泛化能力:在深度神经网络中,Dropout 可以显著减少过拟合,尤其是在大规模数据集不足的情况下。

总结来说,Dropout 是一种简单但有效的正则化技术,通过随机丢弃神经元来减少模型的过拟合风险,并提高其泛化性能。

代码

import torch
import torch.nn as nndef test():# Step 1: 初始化一个Dropout层,p=0.4表示有40%的神经元在训练时会被“丢弃”dropout = nn.Dropout(p=0.4)# Step 2: 创建一个随机输入张量,大小为[1, 4],表示输入层的权重,随机生成0-9之间的整数,并将其转换为float类型inputs = torch.randint(0, 10, size=[1, 4]).float()# Step 3: 初始化一个全连接层,输入维度为4,输出维度为5layer = nn.Linear(4, 5)# Step 4: 对输入数据进行前向传播,通过全连接层计算输出y = layer(inputs)# 打印未经过Dropout层的全连接层输出结果print("未失活FC层的输出结果:\n", y)# Step 5: 对全连接层的输出结果应用Dropout,随机丢弃40%的神经元y = dropout(y)# 打印经过Dropout层后全连接层的输出结果print("失活后FC层的输出结果:\n", y)# 调用函数
test()

详细讲解:

  1. Dropout层的初始化

    dropout = nn.Dropout(p=0.4)

    这里初始化了一个 Dropout 层,其中参数 p=0.4 表示在训练时,每个神经元有 40% 的概率会被随机“失活”(即丢弃),其输出值会被设置为 0。p 值的选择影响网络的正则化强度,p=0.4 说明这个网络比较倾向于在训练中通过随机丢弃一部分神经元来防止过拟合。

  2. 输入张量的初始化

    inputs = torch.randint(0, 10, size=[1, 4]).float()

    这一行代码生成了一个大小为 [1, 4] 的张量,表示输入层的 4 个特征,张量内的值为随机生成的 0 到 9 之间的整数,并将其转换为 float 类型(因为神经网络通常需要浮点数进行运算)。

  3. 全连接层的初始化

    layer = nn.Linear(4, 5)

    这里初始化了一个 线性(全连接)层,它的输入维度为 4,输出维度为 5。也就是说,这个层接收 4 个输入特征,经过权重矩阵的线性变换后输出 5 个特征。

  4. 前向传播计算输出

    y = layer(inputs)

    这一行代码执行了前向传播,将输入 inputs 通过全连接层计算输出 y。这个计算过程是线性变换: [ y = xW + b ] 其中,W 是权重矩阵,b 是偏置项,x 是输入。

  5. 打印未经过 Dropout 层的输出

    print("未失活FC层的输出结果:\n", y)

    在应用 Dropout 之前,打印未经过 Dropout 层的全连接层的输出结果 y

  6. 应用 Dropout 层

    y = dropout(y)

    在全连接层的输出上应用 Dropout。Dropout 通过随机丢弃 40% 的神经元(根据 p=0.4),剩下的神经元的输出会按比例缩放,以保持训练时和测试时的期望值一致。

  7. 打印经过 Dropout 层的输出

    print("失活后FC层的输出结果:\n", y)

    这里打印了经过 Dropout 层之后的输出结果,可以观察到部分神经元的输出会被设置为 0。

代码运行的意义:

  1. Dropout 正则化:Dropout 是一种正则化技术,旨在防止模型过拟合。它通过在训练过程中随机丢弃一部分神经元,使得网络不会过于依赖某些特定的神经元,从而提升模型的泛化能力。

  2. 全连接层与 Dropout 的结合:通过在全连接层后应用 Dropout,可以有效减少过拟合现象,尤其是在深度神经网络的训练过程中。

这个代码演示了如何在全连接层的输出上应用 Dropout,并显示了 Dropout 失活前后的输出差异。

代码2

下面是一个用 Python 实现 Dropout 正则化 的示例代码,并附有详细注释。这个代码展示了如何在前向传播中手动实现 Dropout 正则化机制,而不是使用 PyTorch 自带的 nn.Dropout。

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F# 定义一个简单的神经网络类
class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()# 定义一个全连接层,输入4个特征,输出5个特征self.fc1 = nn.Linear(4, 5)def forward(self, x):# Step 1: 线性变换,输入经过全连接层x = self.fc1(x)# Step 2: 自定义Dropout实现:随机失活40%的神经元dropout_rate = 0.4  # 定义Dropout概率if self.training:  # 仅在训练模式下应用Dropoutmask = (torch.rand(x.shape) > dropout_rate).float()  # 生成一个随机掩码x = x * mask / (1 - dropout_rate)  # 应用掩码并对剩下的神经元缩放# 如果不在训练模式(即推理模式),则不进行Dropout# Step 3: 使用激活函数(这里是ReLU)x = F.relu(x)return x# 主函数
def main():# 创建一个神经网络实例model = SimpleNN()# 设置模型为训练模式(应用Dropout)model.train()# 创建一个随机输入张量,大小为 [1, 4],即1个样本有4个特征inputs = torch.randn(1, 4)# 打印输入print("输入数据:\n", inputs)# 前向传播outputs = model(inputs)# 打印输出print("经过Dropout后的输出:\n", outputs)if __name__ == '__main__':main()

详细注释和讲解:

  1. 初始化神经网络类

    class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()# 定义一个全连接层,输入维度为4,输出维度为5self.fc1 = nn.Linear(4, 5)
    • 这里我们定义了一个简单的神经网络类,包含一个全连接层。nn.Linear(4, 5) 表示输入为 4 个特征,输出为 5 个特征。

  2. 前向传播与 Dropout 实现

    def forward(self, x):# 线性变换,输入经过全连接层x = self.fc1(x)
    ​# 自定义Dropout实现:随机失活40%的神经元dropout_rate = 0.4  # 定义Dropout概率if self.training:  # 仅在训练模式下应用Dropoutmask = (torch.rand(x.shape) > dropout_rate).float()  # 生成一个随机掩码x = x * mask / (1 - dropout_rate)  # 应用掩码并对剩下的神经元缩放
    ​# 使用ReLU激活函数x = F.relu(x)return x
    • 全连接层计算x = self.fc1(x) 对输入进行线性变换。

    • Dropout 实现

      • 我们生成一个与输出形状相同的随机掩码 mask,该掩码中每个元素是随机生成的 0 到 1 之间的浮点数。

      • 将这些浮点数与 dropout_rate 进行比较,大于 dropout_rate 的部分保留,其他部分被设置为 0。

      • 然后,将输出乘以掩码,并对保留的神经元进行缩放(除以 1 - dropout_rate),确保期望值不变。

    • ReLU 激活:最后,使用 ReLU 激活函数对输出进行非线性处理。

  3. 主函数

    def main():model = SimpleNN()model.train()  # 设置模型为训练模式(应用Dropout)
    ​inputs = torch.randn(1, 4)  # 随机生成输入数据,形状为 [1, 4]
    ​# 打印输入print("输入数据:\n", inputs)
    ​outputs = model(inputs)  # 前向传播print("经过Dropout后的输出:\n", outputs)
    • 模型训练模式:通过 model.train() 告诉模型当前是训练模式,Dropout 将会被应用。

    • 输入数据:随机生成大小为 [1, 4] 的输入张量,这里表示一个样本,具有 4 个特征。

    • 前向传播与输出:模型对输入进行前向传播,计算结果并打印 Dropout 后的输出。

运行结果

当你运行代码时,你会看到:

  • 输入数据是一个随机生成的 4 维向量。

  • 经过全连接层和 Dropout 操作后的输出,其中部分神经元会被丢弃,输出结果中某些值会变为 0。

总结:

  • Dropout 正则化通过随机丢弃神经元的方式防止神经网络的过拟合,尤其适合在训练深度网络时使用。

  • 在这个代码中,我们手动实现了 Dropout 的基本机制,展示了如何在前向传播中应用 Dropout,并控制训练模式和推理模式下的行为差异。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Elasticsearch系列廿二】特殊参数

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Kafka系列之:安装使用kafka_exporter详细步骤

Kafka系列之:安装使用kafka_exporter详细步骤 一、kafka_exporter二、下载kafka_exporter三、理解Topic Metrics指标四、理解Consumer Groups Metrics指标五、启动kafka_exporter六、查看页面七、systemctl托管服务一、kafka_exporter kafka_exporter源码kafka_exporter下载页…

企业智能培训新方案,高效打造金牌员工

标品市场竞争激烈,小微企业因长期专注于非标业务或者偏定制化路线,在团队专业能力与大型企业间存在显著差距。专业人才短缺、培养成本高企、培训滞后、效果难测、资源不均、考核标准不一及知识转化率低等问题,成为其业务转型的绊脚石。 如何高…

Java项目: 基于SpringBoot+mybatis+maven师生共评的作业管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven师生共评的作业管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、…

Python办公自动化案例:实现XMind文件转换成Excel文件

案例:实现XMind文件转换成Excel文件 将XMind文件转换为Excel文件的过程可以通过几个步骤来实现,主要涉及到读取XMind文件,解析其内容,然后创建一个Excel文件并将解析的内容写入。以下是一个简化的Python脚本,展示了如何使用xmindparser库来解析XMind文件,并使用pandas库…

虚拟现实技术在相亲交友中的应用未来趋势

随着虚拟现实(VR)技术的不断进步,它已经开始渗透到我们生活的方方面面,其中包括相亲交友领域。相亲交友网站作为人们寻找另一半的重要平台,也在积极探索VR技术的应用可能性。本文将探讨VR技术在未来相亲交友网站上的几…

球体检测系统源码分享

球体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

2024年双十一有哪些值得买?这些好物来看看!

2024年双十一有哪些值得入手的好物?在这个全民共享的购物盛宴里,我们精心挑选了一系列好物,旨在为您的生活添彩加温。从科技尖货到日常百货,从时尚潮流到家居必备,每一分每一秒都蕴含着超值优惠与惊喜发现。不论是自我…

无人机视角下的车辆数据集

车辆数据集 无人机视角下的车辆数据集。数据集为无人机俯拍的真实场景下的车辆机动车数据集。数据集已经标注好,yolo格式,txt标签。数据集已经划分好训练集(20970张图片)验证集(5242张图片)测试集&#xff…

峟思:山洪灾害监测预警系统全面解析

在自然灾害频发的今天,山洪灾害以其突发性强、破坏力大而备受关注。为了有效预防和减少山洪灾害带来的损失,山洪灾害监测预警系统应运而生。本文将详细介绍该系统的主要组成部分、关键传感器及其工作机制,以期为防灾减灾工作提供有力支持。 山…

影响RPA流程稳定运行的若干因素|实在RPA研究

RPA发展现状 当前,中国正处于实现高质量发展、数字化转型升级的关键时期。RPA作为数字化转型的一项重要工具,已经开始在许多领域发挥积极作用。 RPA(Robotic Process Automation 机器人流程自动化)是一种通过软件机器人自动执行…

路劲单伟彪:不乐观、不悲观,不藏着、不掖着

路劲单伟彪:不乐观、不悲观,不藏着、不掖着_简篇-美篇工作版 9月10日,史上超强台风“摩羯”已逐渐远离香港,天空开始放晴。在香港屯门凯和山,路劲集团主席单伟彪时隔一年再一次接受凤凰网专访。 对话自然从这一年的市场…

为什么自学python那么难?

在科技日新月异的今天,编程能力已成为一项备受追捧的技能。仿佛一夜之间,各种编程学习资源如雨后春笋般涌现,让人眼花缭乱。然而,许多人投身于自学编程的行列,却往往在半路折戟沉沙。究竟是什么原因让自学编程变得如此…

远程监控电脑屏幕用什么软件?8款真实好用的远程监控电脑屏幕软件推荐!

远程监控电脑屏幕是现代企业管理、远程协作以及家庭安全中的重要需求。 为了满足这一需求,市场上涌现出了多款功能强大、操作便捷的远程监控软件。 以下是8款真实好用的远程监控电脑屏幕软件推荐: 1. 安企神软件 特点:此软件专为企业设计&…

骨传导耳机哪个牌子好?深度解析五大高销量骨传导耳机!

在快节奏的现代生活中,耳机已成为我们不可或缺的伴侣,无论是在通勤路上、健身时还是日常工作中,它都能为我们提供音乐、通话和信息的即时接入。随着科技的发展,耳机的种类也日益丰富,其中骨传导耳机以其独特的声音传导…

恢复数据解决方案 :因意外删除而丢失重要数据的痛苦急救方法

您是否因意外删除 iOS 设备上的重要文件而丢失了文件?您听说过Geekersoft iPhone 数据恢复工具吗?Geekersoft iPhone 数据恢复工具提供了恢复丢失数据的完美解决方案。此 iOS 数据恢复工具具有多种恢复模式,可恢复已删除的文件。 全球许多用…

老包莫名被暂停、删除?Google Play审核这些坑你踩了吗?

相信很多开发者都经历过这样的“晴天霹雳”:自己辛辛苦苦维护多年的应用,突然之间被Google Play暂停或直接删除,理由是“欺骗行为”。收到这样的邮件,开发者往往是一脸懵逼,尤其是那些在架时间长、老老实实运营的“老包…

测试3个月,成功入职 “字节”,我的面试心得总结!

今天来给大家讲一下软件测试工程师的面试一些技巧、建议,以及你们在面试过程中需要做的一些准备、注意事项。 很多的小伙伴在刚刚学习完软件测试后就要面临一个问题:就业找工作。找工作要面临的第一件事儿就是面试,很多小伙伴对面试完全是模糊…

进阶SpringBoot之分布式系统与 RPC 原理

分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统 分布式系统是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统 其目的是利用更多的机器,处理更多的数据 RPC(Remote Pr…

两数之和、三数之和、四数之和

目录 两数之和 题目链接 题目描述 思路分析 代码实现 三数之和 题目链接 题目描述 思路分析 代码实现 四数之和 题目链接 题目描述 思路分析 代码实现 两数之和 题目链接 LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode) 题目…