当进行模型训练的时候,往往可能错过模型的最佳临界点,即当达到最大精度的时候再进行训练,测试集的精度会下降,这时候就会出现过拟合,如果能在其临界点处提前终止训练,就能得到表达力较强的模型,从而也避免了过拟合,这种方法就叫early stopping,但是这种方法多依靠人的经验和感觉去判断,因为无法准确的预测后面还有没有最佳临界值,所以这种方法更适合老道的深度学习人员,而对于初学者或者说直觉没有那么准的人,则有一种更简便的方法——dropout,它的大致意思是在训练时,将神经网络某一层的单元(不包括输出层的单元)数据随机丢失一部分。

具体而言,使用dropout集成方法需要训练的是从原始网络去掉一些不属于输出层的单元后形成的子网络,如图:

可以将每次的单元丢弃都理解为是对特征的一种再采样,这种做法实际上是等于创造出了很多新的随机样本,以增大样本量,减少特征量的方法来防止过拟合。

在使用复杂的卷积神经网络训练大型的图像识别神经网络模型时使用dropout方法会得到显著的效果,我们可以把dropout的过程想象成随机将一张图片(或某个网络层)中一定比例的数据删除调(即这部分数据都变为0,在图像中0代表黑色),这样就模拟了将图像中某些位置涂成黑色,此时人眼很有可能辨认出这张图片的内容,当然,模型也可以用其进行训练。

tensorflow中提供了很简单的使用方法:

network = keras.Sequential([
keras.layers.Dense(256,activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(128,activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(64,activation='relu'),
keras.layers.Dense(32,activation='relu'),
keras.layers.Dense(10)
])

在使用dropout之后,在前向传播时必须声明training参数,因为模型的train和test的策略是不一样的,所以需要人为的做区分,区分方法就是给定training参数的值(True或False),以此来指定当前状态。

代码如下:

for step,(x,y) in enumerate(db_train):
# train
with tf.GradientTape() as tape:
x = tf.reshape(x,(-1,28*28))
out = network(x,training=True)
# …… # test
out = network(x,training=False)

防止或减少过拟合的方式(二)——Dropout的更多相关文章

  1. Spring面向切面编程(AOP)方式二

    使用注解进行实现:减少xml文件的配置. 1 建立切面类 不需要实现任何特定接口,按照需要自己定义通知. package org.guangsoft.utils; import java.util.D ...

  2. 自学Python4.8-生成器(方式二:生成器表达式)

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  3. Java实现购物车功能:方式一:存放在session中.方式二:存储在数据库中

    //将购物车产品加入到cookie中,方式同浏览记录.Java实现购物车,方式一(简易版):存储在session中.这种方式实现还不严谨,大家看的时候看思路即可.(1). JSP页面中,选择某一款产品 ...

  4. Cookie实现商品浏览记录--方式二:JS实现

    使用Cookie实现商品浏览记录:方式二:JS方法实现cookie的获取以及写入.当某一个产品被点击时,触发JS方法.利用JS方法判断一下,此产品是否在浏览记录中.如果不存在,则将产品ID加入到coo ...

  5. spring boot整合mybatis方式二

    方式二: pom文件导入maven依赖: <dependency> <groupId>org.springframework.boot</groupId> < ...

  6. H5 66-清除浮动方式二

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)

    方式一: 运行截图 数据库的sql语句: /*Navicat Oracle Data TransferOracle Client Version : 12.1.0.2.0 Source Server ...

  8. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...

  9. md5加密+盐方式二

    这类md5+盐加密是属于自定义盐值的简单方法! 1.导入架包 2.调用方法 DigestUtils.md5Hex(password);//加密方法 举例 方式一: password=DigestUti ...

随机推荐

  1. Oracle 数据泵(IMPDP/EXPDP)导入导出总结

    Oracle数据泵导入导出是日常工作中常用的基本技术之一,它相对传统的逻辑导入导出要高效,这种特性更适合数据库对象数量巨大的情形,因为我日常运维的数据库对象少则几千,多则几万甚至几十万,所以传统exp ...

  2. 【WPF学习】第三十章 元素绑定——绑定到非元素对象

    前面章节一直都在讨论如何添加链接两个各元素的绑定.但在数据驱动的应用程序中,更常见的情况是创建从不可见对象中提取数据的绑定表达式.唯一的要求是希望显示的信息必须存储在公有属性中.WPF数据绑定数据结构 ...

  3. Kubernetes-Service资源详解

    service的三种工作模式:(userstats(效率低).iptables.ipvs) service可以自动实现负载均衡.service自动实现了负载均衡,service通过selector标签 ...

  4. Kafka动态配置实现原理解析

    问题导读 Apache Kafka在全球各个领域各大公司获得广泛使用,得益于它强大的功能和不断完善的生态.其中Kafka动态配置是一个比较高频好用的功能,下面我们就来一探究竟. 动态配置是如何设计的? ...

  5. Docker(二):理解容器编排工具Kubernetes内部工作原理

    一.Kubernetes是什么 要说到Docker就不得不说说Kubernetes.当Docker容器在微服务的环境下数量一多,那么统一的,自动化的管理自然少不了.而Kubernetes就是一个这样的 ...

  6. js关于时间(date)的比较

    之前在工作上遇到一个问题:使用一些时间插件,如果有俩个时间,要判断结束时间和开始时间的大小?后来就查找了一些资料,这边整理出俩个比较简便的方法. 在这我拿 laydate.js 这个插件来举例: 首先 ...

  7. 在Centos上安装docker,部署mysql数据库

    何为docker? Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 本机环境 24小时不关机的Centos ...

  8. 一些可以查询IP地理位置、身份证所在地、手机归属地的接口

    查询IP http://ip.dnsexit.com/ 新浪的IP查询接口: 新浪的:http://counter.sina.com.cn/ip?ip=IP地址 返回Js数据,感觉不是很精确,可以把问 ...

  9. FPGA基础知识关键点摘要

    FPGA基础知识关键点摘要 一.组合逻辑和时序逻辑的区别:组合逻辑与输入直接实时相关,时序逻辑还必须在时钟上升沿出发后输出新值,有没有时钟输入是他们最大的区别!组合时序容易出现竞争冒险现象出现亚稳态, ...

  10. HDU_1175_莫队+逆元

    http://acm.hdu.edu.cn/showproblem.php?pid=5145 初探莫队,就是离线排序后的暴力,但是效率大大提高,中间要除法取模,所以用到了逆元. #include< ...