[PyTorch][chapter 8][李宏毅深度学习][DNN 训练技巧]

news2024/11/19 1:24:07

前言:

   

       DNN 是神经网络的里面基础核心模型之一.这里面结合DNN 介绍一下如何解决

深度学习里面过拟合,欠拟合问题


目录:

  1.      DNN 训练常见问题
  2.      过拟合处理
  3.     欠拟合处理
  4.     keras 项目


一  DNN 训练常见问题

  我们在深度学习网络训练的时候经常会遇到下面两类问题:

         1:  训练集上面很差 : 欠拟合

         2: 训练集上面很好, 测试集上面很差: 过拟合


二  过拟合解决

过拟合解决方案

主要有以下三个处理思路

1 Early Stopped

2 L1 L2 正规化

3 Dropout

4: 增加训练集上面的数据量

 2.1  Early Stopping

   方案

   这个数据集分为3部分: Training Data,validation data,Test Data
   1  将训练的数据分为Training Data 和validation data
   2  每个epoch结束后(或每N个epoch后):计算validation data 的 accuracy 
   3: 更新 最优 validation data accuracy 对应的网络参数
   3  随着epoch的增加,如果validation data 连续多次没有提升,则停止训练;
   4  将之前validation data 准确率最高时的权重作为网络的最终参数。

2.2  正规化

      分为L1,L2 正规化.

2.3 Dropout

原网络结构

            z^{l+1}=w^{l+1}a^l+b^{l+1}

            a^{l+1}=\sigma(z^{l+1})

训练:

            Dropout

            a^{l}: 上面每个输入值以p%的概率变为0     

           z^{l+1}=w^{l+1}a^l+b^{l+1}

            a^{l+1}=\sigma(z^{l+1})

测试: 

          权重系数

             w^{l}=w^l*(1-p)

            一般p 设置为0.5

           

4  增加数据集上面数据量

      作用  降低方差


三  欠拟合

欠拟合处理方案

主要有下面5个处理思路:

     1 超参数调节: 学习率 训练轮次,batch_size

     2 更换激活函数

     3 梯度更新算法优化

     4  网络模型优化

     5 损失函数 更换

3.1  超参数调参

         主要更换学习率,增加迭代轮数等

 

3.2 更换激活函数

      DNN 随着网络层数的增加会出现梯度弥散现象,可以通过把激活函数sigmod 更换为

ReLu 一定程度上面优化该方案。    

    更换激活函数 ReLu(导数为1,链式求导的时候连乘不会减少)

        增加,减少 网络层数(梯度弥散,梯度爆炸)

        

3.3 梯度更新优化算法

      方案1  SGD 随机梯度下降

         \theta=\theta-\eta \bigtriangledown J(\theta)

        当梯度为0,参数无法更新容易陷入到局部极小值点

        学习率太大: 不容易进入到极小值点,容易发生网络震荡

         学习率太小: 收敛速度慢

 方案2 Momentum: 当前的梯度 = 当前的梯度+历史梯度

           SGD 会发生震荡而迟迟不能接近极小值,所以对更新梯度引入Momentum概念,加速SGD,并抑制震荡(也就是在SGD基础上引入了一阶动量)

            初始化动量:

                           m_0 =0: 动量

     

                             m_{t}=\lambda m_{t-1}+(1-\lambda)\bigtriangledown J(\theta_t): 动量

                             \theta_t=\theta_t -\eta m_t

           整个思想: 有点跟马尔科夫链时序链相似,当前输出值不仅仅跟当前的

输入相关,也跟历史值相关。

            

方案3:Adagrad (Adaptive Gradient,自适应梯度)

             不同参数进行不同程度的更新 - 逐参数适应学习率方法

           方案:

          在Adagrad算法中,每个参数的学习率各不相同。计算某参数的学习率时需将该参数前面所有时间步的梯度平方求和,随着时间步的增加,学习率将减小.

      v_t=\sum_{\tau=0}^{t}g_{\tau }^2

       \theta_t=\theta_t-\frac{\eta }{\sqrt{v_t+\varepsilon }}g_t

      

v_t: 二阶动量,权重系数里面的每个系数单独计算

\epsilon =1e-7

g_t: 当前权重系数的梯度

Adgrad方法中,学习率一直在衰减,所以可以起到抑制震荡的作用,

对于频繁更新的参数,它们的二阶动量比较大,学习率小;

对于不怎么更新的参数,它们的二阶动量比较小,学习率就大。

但因为那个分母是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识

    

方案4 RMSProp:

Root Mean Square Propagation,自适应学习率方法,由Geoff Hinton提出,是梯度下降优化算法的扩展。在AdaGrad的基础上,对二阶动量的计算进行了改进:即有历史梯度的信息,但是我又不想让信息一直膨胀,那么只要让历史信息一直衰减就好了。因此得到RMSProp的二阶动量计算公式:

如下图所示,截图来自:https://arxiv.org/pdf/1609.04747.pdf

方案4 Adam算法即自适应时刻估计方法(Adaptive Moment Estimation)

算法思想  moment+Adagrad

同时考虑了动量 和二阶动量

3.4  更换损失函数

      比如mse 更换成CRE

3.5 更换模型

         增加网络层次,参数例如

      或者

           RNN 用LSTM  

           CNN 里面的ResNet

             解决梯度弥散问题



四    keras 

          Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 [1]。
Keras在代码结构上由面向对象方法编写,完全模块化并具有可扩展性,其运行机制和说明文档有将用户体验和使用难度纳入考虑,并试图简化复杂算法的实现难度 [1]。Keras支持现代人工智能领域的主流算法,包括前馈结构和递归结构的神经网络,也可以通过封装参与构建统计学习模型 [2]。在硬件和开发环境方面,Keras支持多操作系统下的多GPU并行计算,可以根据后台设置转化为Tensorflow、Microsoft-CNTK等系统下的组件 [3]。
Keras的主要开发者是谷歌工程师François Chollet,此外其GitHub项目页面包含6名主要维护者和超过800名直接贡献者 [4]。Keras在其正式版本公开后,除部分预编译模型外,按MIT许可证开放源代码 [1]

   keras 创建一个神经网络,训练,测试主要流程如下

model模型搭建
compile损失函数,loss, batch_size
fit训练
evaluate验证测试集
predict预测
model = Sequential()

#输入层
model.add(Dense(input_dim=28*28,
units = 500,
activation='relu'))

#1 隐藏层
model.add(Dense(units=500,
activation='relu'))

#2 输出层
model.add(Dense(units=10,
activation='softmax'))


model.compile(loss='categorical_crossentropy',
optimizer='adam'
metrics =['accuracy'])


#3 pick the best function ,完成训练工作
model.fit(x_train, y_train, batch_size=100, epochs=20)

#4 使用该模型
score = model.evaluate(x_test,y_test)
result = model.predict(x_test)

参考:

9-1: Tips for Training DNN_哔哩哔哩_bilibili

【优化算法】一文搞懂RMSProp优化算法 - 知乎

神经网络-优化器篇-从梯度下降到Adam方法 - 知乎

https://www.cnblogs.com/picassooo/p/12347927.html

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

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

相关文章

Android原生实现分段选择

六年前写的一个控件,一直没有时间总结,趁年底不怎么忙,整理一下之前写过的组件。供大家一起参考学习。废话不多说,先上图。 一、效果图 实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的backgr…

什么是EMC工程师?

摘要: 今天来介绍一下什么是EMC工程师。一 EMC工程师起源要了解什么是EMC工程师,我们首先要了解什么是EMC。 今天来介绍一下什么是EMC工程师。 一 EMC工程师起源 要了解什么是EMC工程师,我们首先要了解什么是EMC。 工程师这个职业相信大家都耳熟能详…

Android10.0 人脸解锁流程分析

人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持,也为安全合规地启用集成交易的应用(网上银行或其他服务&am…

华为OD机试 - 推荐多样性(Java JS Python C)

题目描述 推荐多样性需要从多个列表中选择元素,一次性要返回 N 屏数据(窗口数量),每屏展示 K 个元素(窗口大小),选择策略: 各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推每个列表的元素尽量均分为…

wireshark access/trunk/hybrid报文分析

1,access接口 发送带vlan的报文 wireshark交换机配置 [Huawei-GigabitEthernet0/0/1] [Huawei-GigabitEthernet0/0/1]port link-type access [Huawei-GigabitEthernet0/0/1]port default vlan 100 [Huawei-GigabitEthernet0/0/2]port link-type access [Huawei-Gig…

前端开发之通过vue-office组件实现文件预览

前端开发之通过vue-office组件实现文件预览 前言效果图docx文件xlsx文件pdf文件 vue中简单案例1、安装组件2、vue中代码 前言 在实现文件预览的时候我们可以通过vue-office组件来实现文件的预览效果 效果图 docx文件 xlsx文件 pdf文件 vue中简单案例 1、安装组件 整体安装…

LoongArch指令集-特权指令系统——摘抄自胡伟武体系结构和龙芯架构32位精简版参考手册

例外与中断 1 中断 1.1 中断类型 龙芯架构 32 位精简版下的中断采用线中断的形式。每个处理器核内部可记录 12 个线中断,分别是:1 个核间中断(IPI),1 个定时器中断(TI),8 个硬中断…

Muscles|Tissue —— Workflow

目录 Muscles pass Tissue pass Skin pass Simulation transfer Muscles pass Muscles & Tissue的第一阶段内,为模拟创建muscle pass,会创建solid肌肉几何体(用动画骨骼移动和弯曲),然后驱动下游组织的大部分变…

1.SQL - 概述

1. SQL语句分类 • 数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等 • 数据操作语言:简称DML(Data …

13.鸿蒙HarmonyOS App(JAVA)文本框组件按钮点击提示

13.鸿蒙HarmonyOS App(JAVA)文本框按钮点击提示 点击按钮触发组件状态,点击改变颜色 文本框组件,文本居中,斜体,左右对齐,点击显示提示信息 Button button(Button) findComponentById(ResourceTable.Id_btn_1); but…

【cesium-5】鼠标交互与数据查询

scene.pick返回的是包含给定窗口位置基元的对象 scene.drillpack返回的是给定窗口位置所有对象的列表 Globe.pick返回的是给光线和地形的交点 Cesium.ScreenSpaceEventType.MIDDLE_CLICK 鼠标中间点击事件 Cesium.ScreenSpaceEventType.MOUSE_MOVE 鼠标移入事件 Cesium.ScreenS…

【自然语言处理】第2部分:识别文本中的个人身份信息

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

模拟EXCEL排序

7-78 模拟EXCEL排序 分数 25 全屏浏览题目 作者 陈越 单位 浙江大学 Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。 输入格式: 输入的第一行包含两个正整数N(≤105) 和C,其中N是纪录的条数,C是指定排序的列号。之后有 N行&am…

蓝桥杯c/c++程序设计——数位排序

数位排序【第十三届】【省赛】【C组】 题目描述 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。 当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如&#xff0…

Java—Throwing Exceptions

一、指定方法引发的异常 上一节展示了如何为ListOfNumbers类中的writeList()方法编写异常处理程序。有时,代码捕获可能在其中发生的异常是适当的。然而,在其他情况下,最好让调用堆栈更上层的方法处理该异常。例如&…

echarts自定义鼠标移上去显示,自定义图例,自定义x轴显示

提示:记录一下echarts常用配置,以免后期忘记 1.自定义鼠标移上去效果 tooltip: { show: true, trigger: "axis", axisPointer: { type: "shadow",//默认自定义效果 }, // //自定义鼠标移上去效果 formatter: (v) > { console.log("打印…

postman入门使用

前言 对于postman的基础其实很容易上手实现,也有很多教程。 对于小编我来说,也基本可以实现开发任务。 但是今年我们的高级测试,搞了一下postman,省去很多工作,让我感觉很有必要学一下 这篇文章是在 高级测试工程师ht…

云计算:OpenStack 配置二层物理网卡为三层桥的接口

目录 一、理论 1.OpenStack 二、实验 1. Linux系统修改网卡 2.OpenStack 配置二层物理网卡为三层桥的接口 一、理论 1.OpenStack (1)概念 OpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。由NASA(美国国家航空…

7.3 uvm_config_db in UVM

uvm_config_db类派生自uvm_resource_db类。它是uvm_resource_db顶部的另一层便利层,简化了用于uvm_component实例的基本接口(资源库的访问方法)。 下面uvm_config_db类的代码段取自uvm源代码。 class uvm_config_db#(type Tint) extends uv…

Spring Boot:Spring Boot 入门、yaml 配置文件给属性赋值、自动装配原理详解

文章目录 Spring Boot - 01一、概述二、第一个 Spring Boot 程序补充知识 三、配置文件1. yaml 配置文件2. 使用 yaml 配置文件给属性赋值3. 松散绑定以及数据校验4. 配置文件的位置以及多环境配置 四、Spring Boot 分析1. pom.xml2. 启动器3. 主程序4. 自动装配原理5. 主启动类…