热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深度学习入门系列11:用Dropout正则减少过拟合

大家好,我技术人Howzit,这是深度学习入门系列第十一篇,欢迎大家一起交流!深度学习入门系列1:多层感知器

大家好,我技术人Howzit,这是深度学习入门系列第十一篇,欢迎大家一起交流!

深度学习入门系列1:多层感知器概述
深度学习入门系列2:用TensorFlow构建你的第一个神经网络
深度学习入门系列3:深度学习模型的性能评价方法
深度学习入门系列4:用scikit-learn找到最好的模型
深度学习入门系列5项目实战:用深度学习识别鸢尾花种类
深度学习入门系列6项目实战:声纳回声识别
深度学习入门系列7项目实战:波士顿房屋价格回归
深度学习入门系列8:用序列化保存模型便于继续训练
深度学习入门系列9:用检查点保存训练期间最好的模型
深度学习入门系列10:从绘制记录中理解训练期间的模型行为
深度学习入门系列11:用Dropout正则减少过拟合
深度学习入门系列12:使用学习规划来提升性能
深度学习入门系列13:卷积神经网络概述
深度学习入门系列14:项目实战:基于CNN的手写数字识别
深度学习入门系列15:用图像增强改善模型性能
深度学习入门系列16:项目实战:图像中目标识别
深度学习入门系列17:项目实战:从电影评论预测情感
深度学习入门系列18:递归神经网络概述
深度学习入门系列19:基于窗口(window)的多层感知器解决时序问题
深度学习入门系列20:LSTM循环神经网络解决国际航空乘客预测问题
深度学习入门系列21:项目:用LSTM+CNN对电影评论分类
深度学习入门系列22:从猜字母游戏中理解有状态的LSTM递归神经网络
深度学习入门系列23:项目:用爱丽丝梦游仙境生成文本

文章目录

  • 11.1 神经网络Dropout正则化
  • 11.2 在Keras中使用Dropout正则化
  • 11.3 在输入层上使用Dropout
  • 11.4 在隐藏层上使用Dropout
  • 11.5 使用Dropout提示
  • 11.6 总结
    • 11.6.1 接下来



对于神经网络和深度学习模型,一个简单而有力的正则化技术是Dropout。在这节课,你将学习Dropout正则化技术,并学会如何在Python中用Keras将它应用到你的模型中。学完之后你将了解:
  • Dropout正则化技术是如何工作的?
  • 如何在输入层中使用Dropout?
  • 如何在隐藏层中使用Dropout?

11.1 神经网络Dropout正则化

Dropout是Srivastava等人针对神经网络提出的正则化技术。在他们2004论文中 Dropout:A simple way to prevent neural networks from overfitting。Dropout是在训练时随机忽略一些神经元的技术。他们被随机丢弃(drop-out)。这意味着在前向计算时会移除对下游神经元激活函数的贡献,并且在反向传输时也不会更新那些权重。

随着神经网络模型不断地学习,神经元的权值会与整个网络的上下文相匹配。神经元的权重针对某些特征进行调优,具有一些特殊化。周围的神经元则会依赖于这种特殊化,如果过于特殊化,模型会因为对训练数据过拟合而变得脆弱不堪。神经元在训练过程中的这种依赖于上下文的现象被称为复杂的协同适应(complex co-adaptations)。你能想象在训练期间随机丢弃一些神经元,其他神经元不得不对丢失的神经的表示进行预测。我们想象这导致网络学习到多个独立的内部表示。

结果是网络对神经元的特定权重变得不那么敏感。反过来,这将导致网络具有更好的泛化能力,并且不太可能对训练数据过度拟合。

11.2 在Keras中使用Dropout正则化

Dropout 通过随机选择节点能够轻松实现,而这些节点在每次权重更新周期内以一定概率(如20%)丢弃。这就是Keras中如何实现Dropout的。Dropout仅仅在训练模型中使用,并不在评估模型时使用这个技巧。接下来,我们将探索Keras中Dropout的不同使用方法。

这个例子将使用Sonar二分类数据集。我们将使用scikit-learn中10折交叉验证来评估已开发的模型,为了更好获取不同的结果。网络中有60输入值和一个输出值,而且使用这些输入值前都被标准化了。基准神经网络模型有两个隐藏层。第一层60个,第二层30个。训练模型时使用随机梯度下降,用相对较低学习率和动量(momentum)。完整基准模型如下:

# Baseline Model on the Sonar Datasetimport numpy
from pandas import read_csv
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from tensorflow.keras.constraints import max_norm
from tensorflow.keras.optimizers import SGD
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline # fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)# load dataset
dataframe = 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():model = Sequential()model.add(Dense(60, input_dim=60, activation="relu"))model.add(Dense(30, activation="relu"))model.add(Dense(1, activation="sigmoid"))# Compile modelsgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False)model.compile(loss="binary_crossentropy", optimizer=sgd, metrics=["accuracy"])return modelnumpy.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(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
print("Baseline: %.2f%% (%.2f%%)" % (results.mean() * 100, results.std() * 100))

运行这个基准模型,没有使用Dropout生成的近似分类准确率为82%

Baseline: 86.04% (4.58%)

11.3 在输入层上使用Dropout

输入神经元又称之为可见层,能够使用Dropout。在下面这个例子,我们在输入层和第一可见层之间加了Dropout层。Dropout率被设置为20%,意味着有1/5的神经元会在更新周期被随机排除在外。

另外,按照有关Dropout的原始论文的建议,每个神经元施加一个约束,确保权重最大范数不超过3。当我构建层时,在Dense类中设置W_constraint参数。学习速率也提高了一个数量级而且动量增加到0.9。原论文也推荐增加学习速率。从下面基准例子继续,下面代码使用同样网络练习输入层Dropout。

# Baseline Model on the Sonar Dataset
import numpy
from pandas import read_csv
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from tensorflow.keras.constraints import max_norm
from tensorflow.keras.optimizers import SGD
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline # fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)# load datasetdataframe = 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():model = Sequential()model.add(Dropout(0.2, input_shape=(60,)))model.add(Dense(60, input_dim=60, activation="relu"))model.add(Dense(30, activation="relu"))model.add(Dense(1, activation="sigmoid"))# Compile modelsgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False)model.compile(loss="binary_crossentropy", optimizer=sgd, metrics=["accuracy"])return modelnumpy.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(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)print("Baseline: %.2f%% (%.2f%%)" % (results.mean() * 100, results.std() * 100))

运行可见层带有Dropout层的例子,在分类精度上很好提升到86%

Visible: 83.52% (7.68%)

11.4 在隐藏层上使用Dropout

Dropout也可以应用在在你的网络模型上的隐藏神经元。下面这个例子中Dropout可以应用在连个隐藏层之间和最后一个隐藏层与输出层之间。Dropout率为20%再次被使用在这些层权重约束上。


# Baseline Model on the Sonar Datasetimport numpyfrom pandas import read_csv
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from tensorflow.keras.constraints import max_norm
from tensorflow.keras.optimizers import SGD
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline # fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)# load dataset
dataframe = 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():model = Sequential()model.add(Dense(60, input_dim=60, activation="relu", W_constraint=max_norm(3)))model.add(Dropout(0.2))model.add(Dense(30, activation="relu", W_constraint=max_norm(3)))model.add(Dropout(0.2))model.add(Dense(1, activation="sigmoid"))# Compile modelsgd = SGD(lr=0.01, momentum=0.8, decay=0.0, nesterov=False)model.compile(loss="binary_crossentropy", optimizer=sgd, metrics=["accuracy"])return modelnumpy.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(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
print("Baseline: %.2f%% (%.2f%%)" % (results.mean() * 100, results.std() * 100))

我们能看到,对于这个问题和选择的这个网络,在隐藏层上使用了Dropout没有提升。实际上性能比较基准还差。可能需要增加训练次数或者进一步调节学习速率。

Hidden: 83.59% (7.31%)

11.5 使用Dropout提示

Dropout原论文在一套标准机器学习问题上提供实验性结果。因此他们提供了很多有用的启发式考虑在实践时使用Dropout:

  • 一般神经元的Dropout值为20%-50%,而20%是一个不错的起点。太低的概率影响最小,而太高的值会导致网络学习不足。
  • 使用一个更大的网络。你使用一个更大的网络可能会得到一个更好的性能,给模型更多的机会学习独立性表示。
  • 在输入层和隐藏层上使用Dropout。在网络每一层上的使用Dropout正则技术,结果显示不错。
  • 使用一个大的学习速率,并带有延迟和大点动量。将学习率提高10到100倍,并使用高动量值0.9或0.99。
  • 网络权重大小的约束。一个大的学习速率导致一个非常大的网络权重。在网络权重施加一个约束,如使用4或者5大小的max-norm正则,已经证明能够改善结果。

11.6 总结

这节课你已发现深度学习模型下的Dropout正则技术。你已学到:

  • 什么是Dropout和它是如何工作的
  • 如何在自己的深度学习模型上使用Dropout。
  • 在你自己模型上使用Dropout获得最好结果的提示。

11.6.1 接下来

另外一个重要的改善你模型的技术是训练期间调整学习速率。在接下来课程中,你将学习不同学习速率的schedules并且你能够在你的问题上通过Keras使用他们。


推荐阅读
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
  • 基于TensorFlow的鸢尾花数据集神经网络模型深度解析
    基于TensorFlow的鸢尾花数据集神经网络模型深度解析 ... [详细]
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文详细介绍了如何使用 Python 进行主成分分析(PCA),包括数据导入、预处理、模型训练和结果可视化等步骤。通过具体的代码示例,帮助读者理解和应用 PCA 技术。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 在之前的系列中,我们探讨了多个关于AI学习的基础知识点。本篇将重点深入解析NumPy这一关键库的核心功能及其广泛应用。即使您对之前提到的例子印象模糊,也无妨,我们将从头开始,详细分析其代码结构与实现逻辑,如`import numpy as np`等基础语句,帮助您全面理解NumPy在数据处理与科学计算中的重要作用。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • 本文详细介绍了在Windows操作系统上使用Python 3.8.5编译支持CUDA 11和cuDNN 8.0.2的TensorFlow 2.3的步骤。文章不仅提供了详细的编译指南,还分享了编译后的文件下载链接,方便用户快速获取所需资源。此外,文中还涵盖了常见的编译问题及其解决方案,确保用户能够顺利进行编译和安装。 ... [详细]
author-avatar
戴安娜DianaKok
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有