深度学习——过拟合和Dropout

基本概念

什么是过拟合?

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

解决方法

1.增加训练数据量:通过增加更多的训练数据,使得模型能够更好地学习数据的一般规律,而不是过多地依赖于少量的数据样本。
2.简化模型:减少模型的复杂度,如减少网络的层数、减少节点数、减少参数量等,从而降低过拟合的风险。
3.使用正则化技术:如L1正则化、L2正则化等,通过在损失函数中添加正则化项,惩罚过大的权重,防止模型过度拟合训练数据。
4.使用Dropout:在训练过程中随机丢弃部分神经元,减少模型的复杂性,有助于防止过拟合。
5.交叉验证:使用交叉验证来评估模型的性能,通过不同子集的训练集和测试集来评估模型的泛化能力。

Dropout

Dropout是一种用于减少过拟合问题的正则化技术,常用于深度神经网络训练中。是一种随机丢弃(drop)神经元的方法。
在正常的神经网络中,每个神经元都会对输入进行权重计算和传递,这样每个神经元都可能贡献过多,导致网络过拟合训练数据。Dropout通过在训练过程中随机丢弃一部分神经元,即在前向传播过程中以一定的概率将某些神经元的输出置为0,这样可以强制神经网络学习到更加鲁棒的特征。

对比加Dropout层和不加Dropout层

import torch
import matplotlib.pyplot as plt

# 用于复现
# torch.manual_seed(1)    # reproducible

# 20个数据点
N_SAMPLES = 20
# 隐藏层的个数为300
N_HIDDEN = 300

# training data
# 在-1到1之间等差取N_SAMPLES个点,然后再加维度,最终的数据变为N_SAMPLES行、1列的向量
x = torch.unsqueeze(torch.linspace(-1, 1, N_SAMPLES), 1)
# 在均值为0、标准差为1的正态分布中采样N_SAMPLES个点的值,然后乘0.3,加上x,最后得到x对应的y值
y = x + 0.3*torch.normal(torch.zeros(N_SAMPLES, 1), torch.ones(N_SAMPLES, 1))

# test data
test_x = torch.unsqueeze(torch.linspace(-1, 1, N_SAMPLES), 1)
test_y = test_x + 0.3*torch.normal(torch.zeros(N_SAMPLES, 1), torch.ones(N_SAMPLES, 1))

# show data
plt.scatter(x.data.numpy(), y.data.numpy(), c='magenta', s=50, alpha=0.5, label='train')
plt.scatter(test_x.data.numpy(), test_y.data.numpy(), c='cyan', s=50, alpha=0.5, label='test')
plt.legend(loc='upper left')
plt.ylim((-2.5, 2.5))
plt.show()

# 快速搭建神经网络,不加dropout层
net_overfitting = torch.nn.Sequential(
    torch.nn.Linear(1, N_HIDDEN),
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, N_HIDDEN),
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, 1),
)

# 加了dropout层的
net_dropped = torch.nn.Sequential(
    torch.nn.Linear(1, N_HIDDEN),
    torch.nn.Dropout(0.5),  # drop 50% of the neuron
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, N_HIDDEN),
    torch.nn.Dropout(0.5),  # drop 50% of the neuron
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, 1),
)

print(net_overfitting)  # net architecture
print(net_dropped)

# 使用Adam优化神经网络的参数
optimizer_ofit = torch.optim.Adam(net_overfitting.parameters(), lr=0.01)
optimizer_drop = torch.optim.Adam(net_dropped.parameters(), lr=0.01)
# 误差函数使用MSELoss
loss_func = torch.nn.MSELoss()

# 开启交互式绘图
plt.ion()   # something about plotting

# 训练五百步
for t in range(500):
    # 将x输入到不加dropout层的神经网络中,得预测值
    pred_ofit = net_overfitting(x)
    # 将x输入到加了dropout层的神经网络中,得预测值
    pred_drop = net_dropped(x)
    # 计算loss
    loss_ofit = loss_func(pred_ofit, y)
    # 计算loss
    loss_drop = loss_func(pred_drop, y)

    # 梯度清零
    optimizer_ofit.zero_grad()
    optimizer_drop.zero_grad()
    # 误差反向传播
    loss_ofit.backward()
    loss_drop.backward()
    # 优化器逐步优化
    optimizer_ofit.step()
    optimizer_drop.step()

    # 每10步进行更新
    if t % 10 == 0:
        """
            net_overfitting.eval()和net_dropped.eval()是将两个神经网络模型切换到评估模式,
            用于在测试数据上进行稳定的前向传播,得到准确的预测结果。
        """
        # change to eval mode in order to fix drop out effect
        net_overfitting.eval()
        net_dropped.eval()  # parameters for dropout differ from train mode

        # plotting
        plt.cla()
        test_pred_ofit = net_overfitting(test_x)
        test_pred_drop = net_dropped(test_x)
        plt.scatter(x.data.numpy(), y.data.numpy(), c='magenta', s=50, alpha=0.3, label='train')
        plt.scatter(test_x.data.numpy(), test_y.data.numpy(), c='cyan', s=50, alpha=0.3, label='test')
        plt.plot(test_x.data.numpy(), test_pred_ofit.data.numpy(), 'r-', lw=3, label='overfitting')
        plt.plot(test_x.data.numpy(), test_pred_drop.data.numpy(), 'b--', lw=3, label='dropout(50%)')
        plt.text(0, -1.2, 'overfitting loss=%.4f' % loss_func(test_pred_ofit, test_y).data.numpy(), fontdict={'size': 20, 'color':  'red'})
        plt.text(0, -1.5, 'dropout loss=%.4f' % loss_func(test_pred_drop, test_y).data.numpy(), fontdict={'size': 20, 'color': 'blue'})
        plt.legend(loc='upper left')
        plt.ylim((-2.5, 2.5))
        plt.pause(0.1)

        # change back to train mode
        """
            在训练模式下,神经网络中的Dropout层将会生效,即在前向传播过程中会随机丢弃一部分神经元。
            这是为了在训练阶段增加模型的鲁棒性,避免过拟合。
        """
        net_overfitting.train()
        net_dropped.train()

# 关闭交互模式
plt.ioff()
plt.show()

运行效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web地理信息系统开发开源架构设计

Web端地理信息软件系统研发一般包括前端展示、后端服务、地图服务、数据库等几大部分。为了节约项目经费,实现地理信息软件项目研发,采用了开源技术路线,通过对比,采用如下开发架构: 1、前端展示 前端展示采用angular…

FTP与HTTP: 哪种协议更适合大文件传输?

随着互联网技术的发展,网络传输已成为了现代社会中不可或缺的一部分。无论是文本、图像、音频、视频等各种类型的数据,相应的传输协议也在不断地发展和更新。FTP(File Transfer Protocol)和HTTP(Hyper Text Transfer P…

java电子病历系统源码

电子病历系统采取结构化与自由式录入的新模式,自由书写,轻松录入。化实现病人医疗记录(包含有首页、病程记录、检查检验结果、医嘱、手术记录、护理记录等等。)的保存、管理、传输和重现,取代手写纸张病历。不仅实现了…

EGE-UNet, 轻量化U-Net

随着transform 的出现,现在语义分割网路结构越来越复杂,轻量化网路也较少了,有些轻量化也只是名义上的轻量化。今天我看到一篇很好的论文,上海交大发表在 MICCAI 2023 的最新研究工作,一个称为Efficient Group Enhance…

信息与通信工程学科面试准备——通信原理|信息与通信工程方向保研面试题集|BUAA

注意: 以下内容,基本上都是二系通信方向保研复试被提问过的内容。如果是专硕,那么电路分析、电磁场、DSP等方面的问题会更多,这里主要针对通信学硕。以下内容不能保证全覆盖:有的同学被问到什么是范德蒙行列式&#x…

html a标签换行显示

文章目录 用css display属性不用css&#xff0c;可以用<br>标签换行示例 用css display属性 可以使用CSS的display属性来实现多个a标签每行显示一个。 HTML代码&#xff1a; <div class"link-container"><a href"#">Link 1</a>…

前端工程化第一章:webpack5基础(上)

文章目录 1. 什么是webpack&#xff1f;2. webpack使用2.2. 前置知识2.1. 创建一个项目 3. webpack打包3.1. 创建一个webpack.config.js文件3.2. 入口&#xff08;entry&#xff09;3.2.1. webpack.config.js3.2.2. src/index.js3.2.3. package.json 3.3. 输出&#xff08;outp…

基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的课堂人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标…

【论文阅读】2020ECCV-DFDNet

Blind Face Restoration via Deep Multi-scale Component Dictionaries 中文&#xff1a;基于深度多尺度分量字典的盲人脸复原 paper&#xff1a; code&#xff1a;https://github.com/csxmli2016/DFDNet 摘要&#xff1a; 近年来&#xff0c;基于参考的人脸恢复方法因其在真…

使用Seata解决分布式事务问题

说明&#xff1a;在分布式架构下&#xff0c;一个请求需要多个微服务来实现。当一个请求牵扯到多个微服务时&#xff0c;事务问题就变得麻烦起来。 问题描述 现在有三个服务&#xff0c;分别是账户服务、库存服务和订单服务&#xff0c;生成一个订单&#xff0c;需要确保商品…

Docker 命令(二)

查看 docker 版本信息 docker version #查看版本信息docker 信息查看 docker info Client:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)Server:Containers: 0 …

Python补充笔记3-bug问题

目录 一、Bug 粗心导致的语法错误​ ​编辑 知识不熟练导致的错误​ 思路不清晰导致的问题​ 被动掉坑​ 二、try…except…else结构​ 三、try…except…else…finally结构​ 四、常见异常类型​编辑traceback模块 pycharm调试 一、Bug 粗心导致的语法错误 知识不熟练导致的…

【Vue 面试题10道】我好像之前想过要写,不过之前JavaScript面试题比较多,就暂时略过了,这些应该几乎把常问的都包括了

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; 前端面试题 开发工具&#xff1a;Vs Code 本题针对 Vue2 这些几乎把常用的都包括了&#xff0c;问别的就没意思了&#xff0c;毕竟工作拧螺丝嘛 我都好久不用Vue了&#xff0c;不过用了React再回看Vue感觉好简单啊… 其…

Dubbogo 详解

Dubbogo 详解 简介 dubbo功能很强大的微服务开发框架&#xff0c;支持多种通信协议&#xff0c;并具有流量治理的功能。 dubbo在有了大转变&#xff0c;拥抱了云原生&#xff0c;从哪些方面可以体现呢&#xff1f; 推出了自己的Trip协议修复了服务发现的级别&#xff0c;之…

20230723红米Redmi Note8Pro掉在水里的处理步骤

20230723红米Redmi Note8Pro掉在水里的处理步骤 2023/7/23 18:18 百度搜搜&#xff1a;小米手机进水 破音怎么处理 Redmi Note8Pro 6400万全场景四摄 液冷游戏芯 4500mAh长续航 NFC 18W快充 红外遥控 https://www.zhiliancy.com/a/q5podmr12.html 首页 / 热文 / 内容 小米喇叭…

【从删库到跑路】MySQL数据库的索引(一)——索引的结构(BTree B+Tree Hash),语法等

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f354;概述&#x1f354;索引结构⭐B-Tree多路平衡查找树&#x1f3f3;️‍&a…

前端技术Vue学习笔记--001

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue2和Vue3比较2、Vue简介3、Vue快速上手4、插值表达式{{}}5、Vue响应式特性6、Vue指令6.1、v-html指令6.2、v-show指令和v-if指令6.3、v-else指令和v-else-if指令6.4、v-on指令6.4.1、v-on指令基础6.4.2、v-on调用传参 6.…

win10电脑便签常驻桌面怎么设置?

你是否曾经因为繁忙的工作而忘记了一些重要的事项&#xff1f;相信很多人都会回答&#xff1a;忘记过&#xff01;其实在快节奏的职场中&#xff0c;我们经常需要记录一些重要的信息&#xff0c;例如会议时间、约见客户时间、今天需要完成的工作任务等。而为了能够方便地记录和…

阿里云安装宝塔面板

阿里云安装宝塔面板 1.安装步骤2.需要加入安全组&#xff0c;打开端口3.安装宝塔 1.安装步骤 1.这里主要以阿里云的服务器 ECS为例子,需要安装纯净的系统 创建过程: 这边先用的是免费的: 2.需要加入安全组&#xff0c;打开端口 进入实例选项卡&#xff1a; 快速添加&…

低代码平台协同OA升级,促进金融企业信息化建设

编者按&#xff1a;数字化办公是信息化时代每个企业不可避免的&#xff0c;OA系统是数字化办公的关键环节。如何与时俱进&#xff0c;保持企业的活力&#xff0c;增强企业综合竞争力&#xff1f;本文分析了企业OA系统为什么需要升级&#xff0c;并进一步指出如何实现升级。 关…