keras添加正则化全连接_第16章 Keras使用Dropout正则化防止过拟合
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正则化防止过拟合相关推荐
- keras添加正则化全连接_收藏!改善TensorFlow模型的4种方法你需要了解的关键正则化技术(2)...
上一篇文章和同学们分享了两种方法,今天我们继续分享另外两种方法. Batch Normalization 批处理规范化背后的主要思想是,在我们的案例中,我们通过使用几种技术(sklearn.prepr ...
- keras添加正则化全连接_TensorFlow keras卷积神经网络 添加L2正则化
model = keras.models.Sequential([ #卷积层1 keras.layers.Conv2D(32,kernel_size=5,strides=1,padding=" ...
- mysql表全连接_关于mysql 实现表连接(左,右,内,全连接)
mysql 实现表连接(左,右,内,全连接) 查询中出现两个表的连接,下面通过实例来讲解一下各种连接查询的不同之处 表 a,和表b 如下图 a 表中 有 abcd b表中有 abcf 内连接:SELE ...
- 卷积神经网络CNN要点:CNN结构、采样层、全连接层、Zero-padding、激活函数及Dropout
CNN结构: 卷积层:特征提取: 采样层:特征选择: 全连接层:根据特征进行分类. 采样层(pooling): max-pooling:克服卷积层权值参数误差: average-pooling:克服卷 ...
- PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.5. 安装后设置...
16.5. 安装后设置 16.5.1. 共享库16.5.2. 环境变量 16.5.1. 共享库 在一些有共享库的系统里,你需要告诉你的系统如何找到新安装的共享库.那些并不是必须做这个工作的系统包括 F ...
- mysql+5.6+左连接_第5章 索引与算法
5.1 InnoDB存储引擎索引概述 InnoDB常见支持:B+树索引.全文索引.哈希索引. B+树索引并不能找到一个给定键值的具体行,只能找到被查的数据所在的页.然后数据库通过把页读入到内存,再在内 ...
- opencv python 生成画布_第16章 坚持一百秒(《Python趣味创意编程》教学视频)
(图书介绍:童晶:<Python趣味创意编程>新书预告) 本章我们将实现坚持一百秒的游戏,玩家通过移动人脸控制飞碟躲避越来越多的反弹子弹,效果如图所示.首先利用面向对象的知识,实现了一个鼠 ...
- C和指针_第16章_标准数函数库_学习笔记
1.整型函数 这组函数返回整型数值.分为算术.随机数和字符串转换 1.1算术<stdlib.h> int abs( int value ); long int labs( long int ...
- keras库的安装及使用,以全连接层和手写数字识别MNIST为例
1.什么是keras 什么是keras? keras以TensorFlow和Theano作为后端封装,是一个专门用于深度学习的python模块. 包含了全连接层,卷积层,池化层,循环层,嵌入层等等等, ...
最新文章
- 毒霸主程序集成反流氓
- 计算机专业要学几门课呀,计算机专业学生一定要学好这几门课!
- RHEL7出现tkinter.TclError: no display name and no $DISPLAY environment variable
- 服务降级及dubbo中的实现示例
- C#求数组中元素的全排列
- HTMLCSS 第二天 笔记
- 周鸿祎,会是下一个“贾跃亭”吗?
- override和new的区别
- libgc 加 .mak 在 vc6 vs2008 中的编译方法
- 深入浅出InfoPath——如何在项目中引用GAC中的dll文件
- Oracle快速运行一指禅
- C# 滑块长度确认 Scrollbar滑块长度问题 水平垂直滚动条滑块高度宽度问题
- udp端口转发 Linux,Linux iptables 端口转发
- 虚拟麦克风音频输入_收音和录音一次性解决了,这个机顶麦克风可以录音?
- 使用spss求标准化的线性回归方程
- Js逆向教程-05明确js逆向的目标
- mac拷贝文件到u盘,mac拷贝文件到u盘很慢
- vtune下载 windows_VtuneApi32e.dll
- 使用Elasticsearch和Kibana挖掘邮箱
- STLINK怎么与STM32单片机连接