深度学习中的Dropout简介及实现
在训练神经网络模型时候,如果模型相对复杂即参数较多而训练样本相对较少,这时候训练出的模型可能对训练集中的数据拟合的比较好,但在测试集上的表现较差,即出现了过拟合的情况。这种情况下可以使用Dropout来降低过拟合的可能性进而提高模型的泛化能力。过拟合指的是模型在训练数据上损失函数比较小,预测准确率较高,但是在测试数据上损失函数比较大,预测准确率较低。Dropout可以随机地临时选择一些中间层中的神经元,使这些神经元不起作用,即在本次迭代中输出为零,同时保持输入层和输出层的神经元数目不变。在反向传播并更新参数的过程中,与这些节点相连的权值也不需要更新。但是这些节点并不从网络中删除,并且其权值也保留下来,以使这些节点在下一次迭代时重新被选中作为起作用点而参与权值的更新。Dropout由Hinton等人于2012年提出,论文名字为《Improving neural networks by preventing co-adaptation of feature detetors》,关于Dropout更详细的介绍可参考另一篇论文,论文名字为《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》,下面的一些截图均来自此论文,论文下载地址:http://jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf
由于每次使用输入网络的样本进行权值更新时,隐含层的节点都是以一定的概率随机出现,因此不能保证每2个隐含节点每次都能同时出现,这样权值更新将不再依赖于具有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。消除或减弱了神经元节点间的联合适应性,增强了泛化能力。也可以将Dropout看做是模型平均的一种。所谓模型平均,就是把来自不同模型的估计或者预测通过一定的权重平均起来,在一些文献中也称为模型组合。因为对于每次输入到网络的样本,由于隐藏层节点的随机性,其对应的网络结构都是不同的,但所有的这些不同的网络结构又同时共享了隐藏层之间的权值。
Dropout神经网络结构如下图所示:
应用Dropout的多层神经网络中,在训练阶段的前向计算过程如下所示:
标准网络与Dropout网络的基本操作比较如下图所示:
Dropout在训练阶段和测试阶段描述如下图所示:
Dropout适合用于数据量大的大型网络中。Dropout应用在训练阶段,用于减少过拟合。Dropout可以与神经网络的大多数层一起使用,如全连接层、卷积层、循环层。Dropout能被实现在任何隐含层或可见层或输入层,Dropout不能被应用在输出层。
Dropout一般执行过程:
(1). 首先随机(临时)删掉网络中一些隐藏神经元即使某些神经元输出为0,输入输出神经元保持不变
(2). 然后把输入通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w, b)。
(3). 然后继续重复这一过程:恢复被删掉的神经元(此时被删除的神经元参数保持不变,而没有被删除的神经元已经有所更新);从隐藏层神经元中再次随机选择一些神经元临时删除掉(备份被删除神经元的参数);对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b)(没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
以下是测试代码:
#include <time.h>
#include <cmath>
#include <vector>
#include <limits>
#include <string>
#include <tuple>
#include <random>
#include <memory>
#include <random>
#include <opencv2/opencv.hpp>#define EXP 1.0e-5namespace fbc {// ============================ Dropout ================================
template<class T>
int dropout(const T* bottom, int width, int height, T* top, float dropout_ratio = 0.5f)
{if (dropout_ratio <= 0.f || dropout_ratio >= 1.f) {fprintf(stderr, "Error: dropout_ratio's value should be: (0., 1.): %f\n", dropout_ratio);return -1;}std::random_device rd; std::mt19937 gen(rd());std::bernoulli_distribution d(1. - dropout_ratio);int size = height * width;std::unique_ptr<int[]> mask(new int[size]);for (int i = 0; i < size; ++i) {mask[i] = (int)d(gen);}float scale = 1. / (1. - dropout_ratio);for (int i = 0; i < size; ++i) {top[i] = bottom[i] * mask[i] * scale;}return 0;
}} // namespace fbcint test_dropout()
{std::random_device rd; std::mt19937 gen(rd());int height = 4, width = 8, size = height * width;std::unique_ptr<float[]> bottom(new float[size]), top(new float[size]); std::uniform_real_distribution<float> distribution(-10.f, 10.f);for (int i = 0; i < size; ++i) {bottom[i] = distribution(gen);}float dropout_ratio = 0.8f;if (fbc::dropout(bottom.get(), width, height, top.get(), dropout_ratio) != 0) {fprintf(stderr, "Error: fail to dropout\n");return -1;}fprintf(stdout, "bottom data:\n");for (int h = 0; h < height; ++h) {for (int w = 0; w < width; ++w) {fprintf(stdout, " %f ", bottom[h * width + w]);}fprintf(stdout, "\n");}fprintf(stdout, "top data:\n");for (int h = 0; h < height; ++h) {for (int w = 0; w < width; ++w) {fprintf(stdout, " %f ", top[h * width + w]);}fprintf(stdout, "\n");}return 0;
}
执行结果如下图所示:
GitHub: https://github.com/fengbingchun/NN_Test
相关文章:

swift中字符串截取方法(substring)
下面介绍2种swift的字符串截取方法,实际上用到了substringFromIndex,substringToIndex,substringWithRange 1.将String转化为NSString再截取,代码如下: var s"1234567890"var ns1(s as NSString).substringFromIndex(5) var ns2(s as NSString).substrin…

设置IE兼容模式
文件兼容性用于定义让IE如何编译你的网页。此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式。 前言 为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE8引入了文件兼容性。在IE6中引入一个增设的兼容…

程序员的自我修养--链接、装载与库笔记:静态链接
1. 空间与地址分配 对于链接器来说,整个链接过程中,它就是将几个输入目标文件加工后合并成一个输出文件。测试代码a.c和b.c内容如下: // a.c extern int shared;int main() {int a 100;swap(&a, &shared); } // b.c int shared 1;void swap(int* a, in…

开启JAVA自学新篇章
MyEclipse Enterprise Workbench简称MyEclipse,是一款专门用于开发Java, J2EE的 Eclipse 插件集合,该软件不仅功能丰富而且强大,包括了完备的编码、调试、测试和发布功能,利用它我们可以在数据库和JavaEE的开发、发布以及应用程序…

12306系统的秒杀“艺术”:如何抗住100万人同时抢1万张票?
作者 | IT牧场 编辑 | 阿秃每到节假日期间,一二线城市返乡、外出游玩的人们几乎都面临着一个问题——抢火车票。虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场景,相信大家都深有体会。尤其是春节期间,大家不仅使用 1230…

C#不错的扩展工具类
FSLibExtension.NET https://github.com/iccfish/FSLib.Extension WebEssentials2013 https://github.com/iccfish/WebEssentials2013

自己写的程序密码功能 ------数字功能
自己写的程序密码功能 ------数字功能 class LockedViewController: UIViewController { var dataBase:FMDatabase? var i 0 var passwordStr : String? var tempStr : String "" var numStr : String "" //初始输入密码 var reNumStr : String &…

程序员的自我修养--链接、装载与库笔记:Windows PE/COFF
1. Windows的二进制文件格式PE/COFF 在32位Windows平台下,微软引入了一种叫PE(Portable Executable)的可执行格式。作为Win32平台的标准可执行文件格式,PE有着跟ELF一样良好的平台扩展性和灵活性。PE文件格式事实上与ELF同根同源,它们都是由…
神州数码与神州控股、神州信息共同主办首届技术年会,透露出什么信号?
11 月 8 日,神州控股、神州数码集团、神州信息共同主办“数字中国 2019 技术年会”,聚焦云计算、大数据、人工智能、区块链、5G 等前沿技术创新与应用实践,众多领域的技术专家展开了深度交流,共同探讨数字时代的技术创新与协同发展…

osi七层协议和tcp/ip四层协议
(大部分内容为转载)OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议。OSI七层协议是由ISO (International Standards Organization)在…

Swift中页面跳转与传值:
1.简单方式 首先,Swift的跳转可分为利用xib文件跳转与storyboard跳转两种方法,我这里选择使用storyboard的界面跳转方法。 1、通过在storyboard中拉button控件建立segue跳转。 2、通过presentViewController方法进行界面跳转。 这里需要注意presentV…

知乎热议!学完Python之后,我的编程能力竟然退化了!
在知乎上有一个特别火的问题:如何学Python?你会看到很多高赞回答是:我一天就学完了。在大家群嘲的背后,我们来分析一下,为什么在已经学过的人眼里,Python这么容易学,甚至简单到被某些人鄙视呢&a…

libjpeg-turbo介绍及测试代码
很多年之前在https://blog.csdn.net/fengbingchun/article/details/10171583 中简单介绍过libjpeg-turbo的安装,因为libjpeg-turbo一直在维护更新,较之前有了些变化,这里再次整理下,并增加更多的测试代码。 libjpeg-turbo的主页为…

高级特性-多线程,GUI
2019独角兽企业重金招聘Python工程师标准>>> 创建线程两种方式第一种,导入improt thread 模块,thread.start_new_thread(功能函数名称,(参数1,参数2...)) 后面参数为功能函数的参数第二个方式类似于java,导…

Hulu视频如何提升推荐多样性?
作者 | 余沾 整理 | 深度传送门(ID: deep_deliver)导读:本文主要介绍Hulu在NIPS 2018上发表的《Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity》中,提出的DPP算法解决视频推荐…

UITextField长度限制的写法
1.遵循代理 UITextFieldDelegate 2.点击响应方法 userNameText.addTarget(self, action: "tappedOne:", forControlEvents: UIControlEvents.EditingChanged) 3.方法的实现 func tappedOne(textField: UITextField) { textField.text textField.text?.uppercaseS…

通过Python在Windows或Linux上快速搭建HTTP服务器
在Windows 7/10或Ubuntu上可以通过python2.x或python3.x来快速搭建一个简单的HTTP服务器。 如果python为2.x,则可执行:$ python -m SimpleHTTPServer 或 $ python2 -m SimpleHTTPServer 如果python为3.x,则可执行:$ python -m h…

NAND FLASH
NAND Flash 以Micron公司的MT29F2G08为例介绍NAND Flash原理和使用。 1. 概述 MT29F2G08使用一个高度复用的8-bit总线(I/O[7:0])来数据传输、地址、指令。5个命令脚(CLE、ALE、CE#、WE#)实现NAND命令总线接口规程。3个…

swift 中跳转web view的两种方法
首先 遵循代理 引入头文件 #import <WebKit/WebKit.h> 第一种情况 直接跳转 了解不含特殊字符的 import UIKit class NewsViewController: UIViewController,WKNavigationDelegate,UIScrollViewDelegate { var webView : WKWebView WKWebView() override func viewW…

YAML开源库yaml-cpp简介及使用
关于YAML的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/88090609 yaml-cpp是用c实现的用来解析和生成yaml文件的,源码地址在https://github.com/jbeder/yaml-cpp ,这里使用的是最新发布的稳定版0.6.2. 解析和产生yam…

数据安全引担忧?get它,让你吃一颗“定心丸”
网络购物、在线外卖、远程教育、共享单车……如今,这些数字化的消费场景在个人生活中早已司空见惯。同时,在数字化浪潮下,越来越多的企业意识到大数据资产的价值,并试图推动其数字化转型。数据经济飞速发展,带来便捷和…

ETL数据抽取策略
ETL的抽取策略本文所提到的数据加载策略为OLTP系统作为源系统,并进行ETL数据加载到OLAP系统中所采用的一般数据加载策略。依循数据仓库的工作方式,原始资料由源数据库被抽取出来后,将在中间过程被写入到”Operational Data Store”(ODS)&…

iOS下拉tableView实现上面的图片放大效果
#import "ViewController.h" #define kScreenbounds [UIScreen mainScreen].bounds #define kScreenWidth [UIScreen mainScreen].bounds.size.width #define kScreenHeight [UIScreen mainScreen].bounds.size.height // 宏定义一个高度 #define pictureHeight 200…

在Windows7/10上通过VS2013编译FFmpeg 4.1.3源码操作步骤
多年前在https://blog.csdn.net/fengbingchun/article/details/40951403 中对FFmpeg在windows下的编译过程做过说明,那时FFmpeg版本用的2.4.3, VS是2010,现在FFmpeg最新稳定版为4.1.3,通过VS2013进行编译,较之前有了些不同&#x…

GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100)本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者&…

entity framework 使用Mysql配置文件
2019独角兽企业重金招聘Python工程师标准>>> <?xml version"1.0" encoding"utf-8"?> <configuration><configSections><section name"entityFramework" type"System.Data.Entity.Internal.ConfigFile.En…

UIWebView、WKWebView使用详解及性能分析
一、整体介绍 UIWebView自iOS2就有,WKWebView从iOS8才有,毫无疑问WKWebView将逐步取代笨重的UIWebView。通过简单的测试即可发现UIWebView占用过多内存,且内存峰值更是夸张。WKWebView网页加载速度也有提升,但是并不像内存那样提…

FFmpeg中libavutil库简介及测试代码
libavutil是一个实用库,用于辅助多媒体编程。此库包含安全的可移植字符串函数、随机数生成器、数据结构、附加数学函数、加密和多媒体相关功能(如像素和样本格式的枚举)。libavcodec和libavformat并不依赖此库。 以下是测试代码,包括base64, aes, des, …

区块链人才月均薪酬1.6万元?
在上周,我国宣布将重点推动区块链技术的发展,这个消息无疑是为区块链开发者们打了一直强心剂,简直是喜大普奔啊 ! 因为之前区块链这个技术虽然一直在圈内很火,但是却没有得到国家的全面认可和推广,所以很多…

用最少的时间学最多的数据挖掘知识(附教程数据源)| CSDN博文精选
作者 | 宋莹来源 | 数据派THU(ID:DatapiTHU)本文为你介绍数据挖掘的知识及应用。引言最近笔者学到了一个新词,叫做“认知折叠”。就是将复杂的事物包装成最简单的样子,让大家不用关心里面的细节就能方便使用。作为数据科学领域从业…