神经网络的Dropout正则化

dropout技术是神经网络和深度学习模型的一种简单而有效的正则化方式。

本文将向你介绍dropout正则化技术,并且教你如何在Keras中用Python将其应用于你的模型。

读完本文之后,你将了解:

  • dropout正则化的原理
  • 如何在输入层使用dropout
  • 如何在隐藏层使用dropout
  • 如何针对具体问题对dropout调优

神经网络的Dropout正则化

Dropout是Srivastava等人在2014年的一篇论文中提出的一种针对神经网络模型的正则化方法 Dropout: A Simple Way to Prevent Neural Networks from Overfitting

Dropout的做法是在训练过程中随机地忽略一些神经元。这些神经元被随机地“抛弃”了。也就是说它们在正向传播过程中对于下游神经元的贡献效果暂时消失了,反向传播时该神经元也不会有任何权重的更新。

随着神经网络模型不断地学习,神经元的权值会与整个网络的上下文相匹配。神经元的权重针对某些特征进行调优,具有一些特殊化。周围的神经元则会依赖于这种特殊化,如果过于特殊化,模型会因为对训练数据过拟合而变得脆弱不堪。神经元在训练过程中的这种依赖于上下文的现象被称为复杂的协同适应(complex co-adaptations)。

你可以想象一下,如果在训练过程中随机丢弃网络的一部分,那么其它神经元将不得不介入,替代缺失神经元的那部分表征,为预测结果提供信息。人们认为这样网络模型可以学到多种相互独立的内部表征。

这么做的效果就是,网络模型对神经元特定的权重不那么敏感。这反过来又提升了模型的泛化能力,不容易对训练数据过拟合。

Keras的Dropout 正则化

Dropout的实现很简单,在每轮权重更新时随机选择一定比例(比如20%)的节点抛弃。Keras的Dropout也是这么实现的。Dropout技术只在模型训练的阶段使用,在评估模型性能的时候不需使用。

Keras入门博文:
Python Keras (一个超好用的神经网络框架)的使用以及实例
易用的深度学习框架Keras简介

接下来我们看看Dropout在Keras中的一些不同用法

本例子使用了声呐数据集(Sonar dataset)。这是一个二分类问题,目的是根据声呐的回声来正确地区分岩石和矿区。这个数据集非常适合神经网络模型,因为所有的输入都是数值型的,且具有相同的量纲。

数据集可以从UCI机器学习代码库下载。然后把声呐数据集放在当前工作路径下,文件命名为sonar.csv。

我们会用scikit-learn来评价模型质量,为了更好地挑拣出结果的差异,采用了十折交叉验证(10-fold cross validation)方法

每条数据有60个输入值和1个输出值,输入值在送入模型前做了归一化。基准的神经网络模型有两个隐藏层,第一层有60个节点,第二层有30个。使用了随机梯度下降的方法来训练模型,选用了较小的学习率和冲量。

完整的基准模型代码如下所示。

import numpy
    import pandas
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import Dropout
    from keras.wrappers.scikit_learn import KerasClassifier
    from keras.constraints import maxnorm
    from keras.optimizers import SGD
    from sklearn.cross_validation import cross_val_score
    from sklearn.preprocessing import LabelEncoder
    from sklearn.cross_validation import StratifiedKFold
    from sklearn.preprocessing import StandardScaler
    from sklearn.grid_search import gridsearchcv
    from sklearn.pipeline import Pipeline
    from sklearn.grid_search import gridsearchcv
    # fix random seed for reproducibility
    seed = 7
    numpy.random.seed(seed)
    # load dataset
    dataframe = pandas.read_csv("sonar.csv",header=None)
    dataset = dataframe.values
    # split into input (X) and output (Y) variables
    X = dataset[:,0:60].astype(float)
    Y = dataset[:,60]
    # encode class values as integers
    encoder = LabelEncoder()
    encoder.fit(Y)
    encoded_Y = encoder.transform(Y)

    # baseline
    def create_baseline():
        # create model
        model = Sequential()
        model.add(Dense(60,input_dim=60,init='normal',activation='relu'))
         model.add(Dense(30,activation='relu'))
        model.add(Dense(1,activation='sigmoid'))
        # Compile model
        sgd = SGD(lr=0.01,momentum=0.8,decay=0.0,nesterov=False)
        model.compile(loss='binary_crossentropy',optimizer=sgd,metrics=['accuracy'])
        return model

    numpy.random.seed(seed)
    estimators = []
    estimators.append(('standardize',StandardScaler()))
    estimators.append(('mlp',KerasClassifier(build_fn=create_baseline,nb_epoch=300,batch_size=16,verbose=0)))
    pipeline = Pipeline(estimators)
    kfold = StratifiedKFold(y=encoded_Y,n_folds=10,shuffle=True,random_state=seed)
    results = cross_val_score(pipeline,X,encoded_Y,cv=kfold)
    print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100,results.std()*100))

运行代码分类的准确率大概为82%。

Accuracy: 82.68% (3.90%)

在可见层使用Dropout

Dropout可用于输入神经元,即可见层。

在下面这个例子里,我们在输入(可见层)和第一个隐藏层之间加入一层Dropout。丢弃率设为20%,就是说每轮迭代时每五个输入值就会被随机抛弃一个

另外,正如Dropout那篇论文中所推荐的,每个隐藏层的权重值都做了限制,确保权重范数的最大值不超过3。在构建模型层的时候,可以通过设置Dense Class的W_constraint参数实现。

学习率提高了一个数量级,冲量增加到0.9。这也是那篇Dropout论文的原文中所推荐的做法。

顺着上面基准模型的例子,下面的代码是包含输入层dropout的网络模型。

# dropout in the input layer with weight constraint
    def create_model1():
        # create model
        model = Sequential()
        model.add(Dropout(0.2,input_shape=(60,)))
        model.add(Dense(60,activation='relu',W_constraint=maxnorm(3)))
        model.add(Dense(30,W_constraint=maxnorm(3)))
        model.add(Dense(1,activation='sigmoid'))
        # Compile model
        sgd = SGD(lr=0.1,momentum=0.9,KerasClassifier(build_fn=create_model1,results.std()*100))

运行这段代码分类准确率完美地提升到了86%。

Accuracy: 86.04% (6.33%)

在隐藏层使用Dropout

Dropout也可用于模型内的隐藏层节点。

下面这个例子里,Dropout被用于两个隐藏层之间和隐藏层与输出层之间。丢弃率同样设为20%,且使用权重限制。

# dropout in hidden layers with weight constraint
    def create_model2():
        # create model
        model = Sequential()
        model.add(Dense(60,W_constraint=maxnorm(3)))
        model.add(Dropout(0.2))
        model.add(Dense(30,W_constraint=maxnorm(3)))
        model.add(Dropout(0.2))
        model.add(Dense(1,KerasClassifier(build_fn=create_model2,results.std()*100))

我们观察到,对于这个问题以及所设置的模型配置参数,在隐藏层使用dropout并不能提升模型效果。事实上,效果反而比基准更差。

有可能需要增加训练迭代次数,或者是更多地调优学习率。

Accuracy: 82.16% (6.16%)

使用Dropout的小技巧

提出Dropout的那篇论文提供了一些在标准机器学习问题上得到的实践性结论。这些结论在dropout的实际应用中会带来帮助。

  • 通常丢弃率控制在20%~50%比较好,可以从20%开始尝试。如果比例太低则起不到效果,比例太高则会导致模型的欠学习。
  • 在大的网络模型上应用。当dropout用在较大的网络模型时更有可能得到效果的提升,模型有更多的机会学习到多种独立的表征。
  • 在输入层(可见层)和隐藏层都使用dropout。在每层都应用dropout被证明会取得好的效果
  • 增加学习率和冲量。把学习率扩大10~100倍,冲量值调高到0.9~0.99.
  • 限制网络模型的权重。大的学习率往往导致大的权重值。对网络的权重值做最大范数正则化等方法被证明会提升效果

有关Dropout的更多资源

下面这些资料也是关于dropout在神经网络和深度学习模型中应用。

总结

通过本文,我们讨论了dropout正则化技术在深度学习模型中的应用。你应该掌握了:

  • dropout的含义和原理
  • 如何在自己的深度学习模型中使用dropout
  • 使用dropout的小技巧

如果你对dropout或者对本文有任何问题,请留言。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


正则替换html代码中img标签的src值在开发富文本信息在移动端展示的项目中,难免会遇到后台返回的标签文本信息中img标签src属性按照相对或者绝对路径返回的形式,类似:<img src="qinhancity/v1.0.0/ima
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描,过滤,统计汇总等工作,数据可以来自标准输入也可以是管道或文件。当读到第一行时,匹配条件,然后执行指定动作,在接着读取第二行数据处理,不会默认输出。如果没有定义匹配条件,则是默认匹配所有数据行,awk隐含循环,条件匹配多少次,动作就会执行多少次。逐行读取文本,默认以空格或tab键为分割符进行分割,将分割所得的各个字段,保存到内建变量中,并按模式或或条件执行编辑命令。与sed工作原理相比:s
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及他们的组合组成了一个规则,然后检查一个字符串是否与这种规则匹配来实现对字符的过滤或匹配。我们刚才在学习正则表达式的时候,我们表示数字,字母下划线的时候是用w表示的,为什么我们在书写的时候用的是w?我们可以发现我们分割空格的话,并没有达到我们预期的效果,这里我们可以使用正则表达式的方式进行分割。我们可以发现,我们和上面得到的结果不一致,既然出错了,肯定是我们的使用方式不对。看到这里我们就能感受到正则表达式的作用了,正则表达式是字符串处理的有力工具。
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发布,同步更新到和。欢迎大家投稿,,推荐或者自荐开源项目/资源/工具/文章~
本文涉及Shell函数,Shell中的echo、printf、test命令等。
常用正则表达,包括: 密码、 手机号、 身份证、 邮箱、 中文、 车牌号、 微信号、 日期 YYYY-MM-DD hh:mm:ss、 日期 YYY-MM-DD、 十六进制颜色、 邮政编号、 用户名、 QQ号
一、python【re】的用法1、re.match函数·单一匹配-推荐指数【★★】2、re.search函数·单一匹配-推荐指数【★★★★★】3、re.findall函数·多项匹配-推荐指数【★★★★★】4、re.finditer函数·多项匹配-推荐指数【★★★★】5、re.sub函数·替换函数-推荐指数【★★★★】二、正则表达式示例·总有一款适合你1、正则表达式匹配HTML指定id/class的标签2、正则表达式匹配HTML中所有a标签中的各类属性值3、获取标签的文本值
1.借助词法分析工具Flex或Lex完成(参考网络资源)2.输入:高级语言源代码(如helloworld.c)3.输出:以二元组表示的单词符号序列。通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。由于各种不同的高级程序语言中单词总体结构大致相同,基本上都可用一组正则表达式描述,所以构造这样的自动生成系统:只要给出某高级语言各类单词词法结构的一组正则表达式以及识别各类单词时词法分析程序应采取的语义动作,该系统
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。例如:我们在写登录注册功能的时候使用的表单验证(对用户名、密码进行一些字符或长度进行限制) ===> (`匹配`) - 正则表达式还常用于过滤掉页面内容的一些敏感词汇。例如:我们平常在打游戏时候的口吐芬芳被换成了***:full_moon_with_face: ===> (`替换`) - 正则表达式从字符串中获取我们想要的特定部分。例如:我们在逛淘宝的时候在搜索框中搜索内容,会弹出很多与搜索相关的提示内容 ===> (`提取`) etc..
通过上面几个简单的示例,可以了解到常见的基础正则表达式的元字符主要包括以下几个^ 匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配”^”字符本身,请使用"^"$ 匹配输入字符串的结尾位置。如果设置了RegExp对象的 Multiline属性,则"$”也匹配'n'或'r’,。要匹配”$"字符本身,请使用”$". 匹配除"rn"之外的任何单个字符 反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的特殊意义* 匹配前面的子表达式零次或多次。...
给出补充后描述 C 语言子集单词符号的正则文法,设计并实现其词法分析程序。
正则表达式(Regular Expression),又称规则表达式,它不是某个编程语言所特有的,是计算机科学的一个概念,通常被用来检索和替换符合某些规则的文本。
Python Re 正则表达式 数据匹配提取 基本使用
正则表达式:是用来描述字符串内容格式,使用它通常用于匹配一个字符串的内容是否符合格式要求
python的学习还是要多以练习为主,想要练习python的同学,推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程+刷题+面经+求职+讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!