第16章 Keras使用Dropout正则化防止过拟合

简介:

第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正则化的技巧

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

  1. Dropout概率不要太高,从20%开始,试到50%。太低的概率效果不好,太高有可能欠拟合。
  2. 网络要大。更大的网络学习到不同方法的几率更大。
  3. 每层都做Dropout,包括输入层。效果更好。
  4. 学习率(带衰减的)和动量要大。直接对学习率乘10或100,动量设到0.9或0.99。
  5. 限制每层的权重。学习率增大会造成权重增大,把每层的模限制到4或5的效果更好。

16.6 总结

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

  • Dropout的工作原理是什么
  • 如何使用Dropout
  • Dropout的最佳实践是什么
相关文章
|
人工智能 自然语言处理 算法
阿里云智能客服知识运营白皮书
        阿里云智能客服知识运营白皮书的撰写,是协调包括算法工程师、开发工程师、产品设计师、AIT 人工智能训练师人员等多角色,将技术理论基础和实际实践经验进行结合,形成业内首部智能客服知识运营白皮书。白皮书以阿里云智能客服系统为应用标的,面向智能客服中的知识定义、知识应用、知识梳理方法三大环节进行描述和说明,希望为智能客服领域的知识应用提供具备指导性意义的方法论。一直以来,智能客服领域的知
816 1
阿里云智能客服知识运营白皮书
|
9月前
|
人工智能 自然语言处理 机器人
今日AI论文推荐:ReCamMaster、PLADIS、SmolDocling、FlowTok
由浙江大学、快手科技等机构提出的ReCamMaster是一个相机控制的生成式视频重渲染框架,可以使用新的相机轨迹重现输入视频的动态场景。该工作的核心创新在于利用预训练的文本到视频模型的生成能力,通过一种简单但强大的视频条件机制。为克服高质量训练数据的稀缺问题,研究者使用虚幻引擎5构建了一个全面的多相机同步视频数据集,涵盖多样化的场景和相机运动。
492 2
今日AI论文推荐:ReCamMaster、PLADIS、SmolDocling、FlowTok
|
9月前
|
人工智能 自然语言处理 PyTorch
Instella:AMD开源30亿参数语言模型!训练效率碾压同级选手
Instella是AMD推出的30亿参数开源语言模型,基于自回归Transformer架构,支持多轮对话、指令跟随和自然语言理解,适用于智能客服、内容创作和教育辅导等多个领域。
199 1
|
10月前
|
存储 Java 关系型数据库
ssm026校园美食交流系统(文档+源码)_kaic
本文介绍了基于Java语言和MySQL数据库的校园美食交流系统的设计与实现。该系统采用B/S架构和SSM框架,旨在提高校园美食信息管理的效率与便捷性。主要内容包括:系统的开发背景、目的及内容;对Java技术、MySQL数据库、B/S结构和SSM框架的介绍;系统分析部分涵盖可行性分析、性能分析和功能需求分析;最后详细描述了系统各功能模块的具体实现,如登录、管理员功能(美食分类管理、用户管理等)和前台首页功能。通过此系统,管理员可以高效管理美食信息,用户也能方便地获取和分享美食资讯,从而提升校园美食交流的管理水平和用户体验。
|
9月前
|
存储 文件存储 Windows
小白尖叫!DeepSeek安装竟偷占C盘?这样做路径配置 直接根治存储焦虑
惊! 完蛋了! DeepSeek占满了我的C盘~~~~ DeepSeek让我C盘爆炸~~~再见了,DeepSeek
537 3
小白尖叫!DeepSeek安装竟偷占C盘?这样做路径配置 直接根治存储焦虑
FFmpeg开发笔记(五)更新MSYS的密钥环
在《FFmpeg开发实战:从零基础到短视频上线》中,介绍了解决MSYS下FFmpeg交叉编译时遇到的密钥环过期问题。当尝试安装mingw-w64-x86_64-toolchain时,可能出现签名不被信任的错误。这由于MSYS密钥环有效期仅为150天,过期后需更新。通过`pacman-key --list-sigs`检查密钥状态,发现密钥已过期。解决方法是访问`https://repo.msys2.org/msys/x86_64/`下载msys2-keyring最新版,然后验证并安装更新。更新后,密钥环有效期将延长至2024年4月10日,确保能正常安装交叉编译工具链。
274 2
FFmpeg开发笔记(五)更新MSYS的密钥环
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
256 0
|
JavaScript 前端开发
Vue 3 中的 Teleport 是什么?如何使用它
Vue 3 中的 Teleport 是什么?如何使用它
|
存储 缓存 监控
一文带你吃透Redis
一文带你吃透Redis
522 0
|
存储 搜索推荐
无影云电脑使用体验
无影作为云电脑,本身会给我们的办公场景带来云电脑的优势。 通过云端存储和计算,解决了传统个人电脑在性能、数据同步、多终端协同等方面的痛点,使计算更个性化、便捷和高效。 解决了多地办公不便以及其他不稳定的因素
1343 1