Dropout虽然简单,但可以有效防止过拟合。本章关于如何在Keras中使用Dropout。本章包括:

dropout的原理

dropout的使用

在隐层上使用dropout

我们开始吧。

16.1 Dropout正则化

Dropout的意思是:每次训练时随机忽略一部分神经元,这些神经元dropped-out了。换句话讲,这些神经元在正向传播时对下游的启动影响被忽略,反向传播时也不会更新权重。

神经网络的所谓“学习”是指,让各个神经元的权重符合需要的特性。不同的神经元组合后可以分辨数据的某个特征。每个神经元的邻居会依赖邻居的行为组成的特征,如果过度依赖,就会造成过拟合。如果每次随机拿走一部分神经元,那么剩下的神经元就需要补上消失神经元的功能,整个网络变成很多独立网络(对同一问题的不同解决方法)的合集。

Dropout的效果是,网络对某个神经元的权重变化更不敏感,增加泛化能力,减少过拟合。

16.2 在Keras中使用Dropout正则化

Dropout就是每次训练按概率拿走一部分神经元,只在训练时使用。后面我们会研究其他的用法。

以下的例子是声呐数据集(第11章),用scikit-learn进行10折交叉检验,这样可以看出区别。输入变量有60个,输出1个,数据经过正则化。基线模型有2个隐层,第一个有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

# 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, init='normal', activation='relu')) model.add(Dense(1, init='normal', 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))

不使用Dropout的准确率是82%。

Accuracy: 82.68% (3.90%)

16.3 对输入层使用Dropout正则化

可以对表层用Dropout:这里我们对输入层(表层)和第一个隐层用Dropout,比例是20%,意思是每轮训练每5个输入随机去掉1个变量。

原论文推荐对每层的权重加限制,保证模不超过3:在定义全连接层时用W_constraint可以做到。学习率加10倍,动量加到0.9,原论文也如此推荐。对上面的模型进行修改:

# 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, init='normal', activation='relu', W_constraint=maxnorm(3))) model.add(Dense(30, init='normal', activation='relu', W_constraint=maxnorm(3))) model.add(Dense(1, init='normal', activation='sigmoid'))

# Compile model

sgd = SGD(lr=0.1, momentum=0.9, 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_model1, 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))

准确率提升到86%:

Accuracy: 86.04% (6.33%)

16.4 对隐层使用Dropout正则化

隐层当然也可以用Dropout。和上次一样,这次对两个隐层都做Dropout,概率还是20%:

# dropout in hidden layers with weight constraint

def create_model2():

# create model

model = Sequential()

model.add(Dense(60, input_dim=60, init='normal', activation='relu',

W_constraint=maxnorm(3)))

model.add(Dropout(0.2))

model.add(Dense(30, init='normal', activation='relu', W_constraint=maxnorm(3)))

model.add(Dropout(0.2))

model.add(Dense(1, init='normal', activation='sigmoid'))

# Compile model

sgd = SGD(lr=0.1, momentum=0.9, 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_model2, 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))

然而并没有什么卯月,效果更差了。有可能需要多训练一些吧。

Accuracy: 82.16% (6.16%)

16.5 使用Dropout正则化的技巧

原论文对很多标准机器学习问题做出了比较,并提出了下列建议:

Dropout概率不要太高,从20%开始,试到50%。太低的概率效果不好,太高有可能欠拟合。

网络要大。更大的网络学习到不同方法的几率更大。

每层都做Dropout,包括输入层。效果更好。

学习率(带衰减的)和动量要大。直接对学习率乘10或100,动量设到0.9或0.99。

限制每层的权重。学习率增大会造成权重增大,把每层的模限制到4或5的效果更好。

16.6 总结

本章关于使用Dropout正则化避免过拟合。总结一下:

Dropout的工作原理是什么

如何使用Dropout

Dropout的最佳实践是什么

keras添加正则化全连接_第16章 Keras使用Dropout正则化防止过拟合相关推荐

  1. keras添加正则化全连接_收藏!改善TensorFlow模型的4种方法你需要了解的关键正则化技术(2)...

    上一篇文章和同学们分享了两种方法,今天我们继续分享另外两种方法. Batch Normalization 批处理规范化背后的主要思想是,在我们的案例中,我们通过使用几种技术(sklearn.prepr ...

  2. keras添加正则化全连接_TensorFlow keras卷积神经网络 添加L2正则化

    model = keras.models.Sequential([ #卷积层1 keras.layers.Conv2D(32,kernel_size=5,strides=1,padding=" ...

  3. mysql表全连接_关于mysql 实现表连接(左,右,内,全连接)

    mysql 实现表连接(左,右,内,全连接) 查询中出现两个表的连接,下面通过实例来讲解一下各种连接查询的不同之处 表 a,和表b 如下图 a 表中 有 abcd b表中有 abcf 内连接:SELE ...

  4. 卷积神经网络CNN要点:CNN结构、采样层、全连接层、Zero-padding、激活函数及Dropout

    CNN结构: 卷积层:特征提取: 采样层:特征选择: 全连接层:根据特征进行分类. 采样层(pooling): max-pooling:克服卷积层权值参数误差: average-pooling:克服卷 ...

  5. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.5. 安装后设置...

    16.5. 安装后设置 16.5.1. 共享库16.5.2. 环境变量 16.5.1. 共享库 在一些有共享库的系统里,你需要告诉你的系统如何找到新安装的共享库.那些并不是必须做这个工作的系统包括 F ...

  6. mysql+5.6+左连接_第5章 索引与算法

    5.1 InnoDB存储引擎索引概述 InnoDB常见支持:B+树索引.全文索引.哈希索引. B+树索引并不能找到一个给定键值的具体行,只能找到被查的数据所在的页.然后数据库通过把页读入到内存,再在内 ...

  7. opencv python 生成画布_第16章 坚持一百秒(《Python趣味创意编程》教学视频)

    (图书介绍:童晶:<Python趣味创意编程>新书预告) 本章我们将实现坚持一百秒的游戏,玩家通过移动人脸控制飞碟躲避越来越多的反弹子弹,效果如图所示.首先利用面向对象的知识,实现了一个鼠 ...

  8. C和指针_第16章_标准数函数库_学习笔记

    1.整型函数 这组函数返回整型数值.分为算术.随机数和字符串转换 1.1算术<stdlib.h> int abs( int value ); long int labs( long int ...

  9. keras库的安装及使用,以全连接层和手写数字识别MNIST为例

    1.什么是keras 什么是keras? keras以TensorFlow和Theano作为后端封装,是一个专门用于深度学习的python模块. 包含了全连接层,卷积层,池化层,循环层,嵌入层等等等, ...

最新文章

  1. 毒霸主程序集成反流氓
  2. 计算机专业要学几门课呀,计算机专业学生一定要学好这几门课!
  3. RHEL7出现tkinter.TclError: no display name and no $DISPLAY environment variable
  4. 服务降级及dubbo中的实现示例
  5. C#求数组中元素的全排列
  6. HTMLCSS 第二天 笔记
  7. 周鸿祎,会是下一个“贾跃亭”吗?
  8. override和new的区别
  9. libgc 加 .mak 在 vc6 vs2008 中的编译方法
  10. 深入浅出InfoPath——如何在项目中引用GAC中的dll文件
  11. Oracle快速运行一指禅
  12. C# 滑块长度确认 Scrollbar滑块长度问题 水平垂直滚动条滑块高度宽度问题
  13. udp端口转发 Linux,Linux iptables 端口转发
  14. 虚拟麦克风音频输入_收音和录音一次性解决了,这个机顶麦克风可以录音?
  15. 使用spss求标准化的线性回归方程
  16. Js逆向教程-05明确js逆向的目标
  17. mac拷贝文件到u盘,mac拷贝文件到u盘很慢
  18. vtune下载 windows_VtuneApi32e.dll
  19. 使用Elasticsearch和Kibana挖掘邮箱
  20. STLINK怎么与STM32单片机连接

热门文章

  1. tp5.0计划任务删除日志方法
  2. CentOS6.4x64_安装Qt5
  3. 终止线程的三种方法(转)
  4. 正在中止线程 异常处理
  5. I am late!
  6. ECCV 2020 论文大盘点-人体形状与姿态估计篇
  7. ECCV 2020 | 超快的车道线检测
  8. 直播预告 | 视觉SLAM在AR应用上的关键性问题探讨
  9. CVPR 2020丨8比特数值也能训练模型?商汤提出训练加速新算法
  10. 用python偷偷给班级群女同学的颜值进行排名,排最后的 说开学要打爆我