前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >提高模型性能,你可以尝试这几招...

提高模型性能,你可以尝试这几招...

作者头像
云水木石
发布于 2019-07-01 09:28:24
发布于 2019-07-01 09:28:24
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

EZDL到底怎样,试试看…一文中,我尝试了百度推出的在线人工智能设计平台EZDL,其愿景是任何人不用编写一行代码就可以轻松地构建、设计和部署人工智能(AI)模型。从试用效果上看,确实不需要编写一行代码,也不需要什么人工智能知识。但对于一名程序员而言,将人工智能包装到一个黑盒子中,而自己毫无掌控感,总有那么一点不踏实。

如果是自己动手构建模型、训练、预测,哪些地方是我们可以掌控的呢?本文延续EZDL到底怎样,试试看…一文中最后提出的一个问题:模型的准确率为88.82%,我要提高准确率该怎么做?,来谈谈提高模型性能,我们能够采取哪些措施。在一步步提高手写数字的识别率系列文章中,我有简单的谈到如何优化模型,这篇文章将更进一步探讨优化模型的方法。

我们还是以手写数字识别为例,代码改为使用keras框架实现,这里不贴代码,有兴趣的话请至我的github: https://github.com/mogoweb/aiexamples 查看,本文的示例代码位于keras/multi_layer_perceptron目录下。

手写数字识别最简单的实现算法是采用逻辑回归,因为是多分类问题,最后的输出使用softmax代替sigmoid。当然,你也可以把它看做仅有一层的简单神经网络,代码请查看如下链接:

https://github.com/mogoweb/aiexamples/blob/master/keras/multi_layer_perceptron/mlp.py

经过200次迭代,训练结束后,模型在训练集上的准确率为92.36%,验证集上的准确率为92.27%,测试集上的准确率为92.22%。这意味着10个手写数字中只有不到一个没有被正确识别,一个不错的起点。

下面以此作为基线精度,比较不同的优化方法对性能提升的效果。

增加隐藏层

很自然的,我们可以想到第一个改进方法,为模型添加更多的层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NB_CLASSES = 10  # 输出类别数量
N_HIDDEN = 128
# X_train是6000028*28的数据,窄化为60000*784
RESHAPE = 784model = Sequential()
model.add(Dense(N_HIDDEN, input_shape=(RESHAPE, )))
model.add(Activation('relu'))
model.add(Dense(N_HIDDEN))
model.add(Activation('relu'))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))

完整代码请参阅:

https://github.com/mogoweb/aiexamples/blob/master/keras/multi_layer_perceptron/mlp_v2.py

增加的中间层称为隐藏层(hidden layer),这里只添加了一个具有N_HIDDEN个神经元并使用ReLU激活函数的全连接层(Dense)。增加隐藏层,迭代20次之后,训练集上的准确率即可达到94.50%,验证集上为94.63%,测试集上为94.41%。虽然从准确率上看只提高了2.2%,但迭代次数可以大大减少。实际上如果同样迭代200次,准确率还可以提升。

那是不是我们增加更多的层,得到的准确率就会更高呢?事实上并非如此,经过尝试,比如在隐藏层数为5时,在训练集、验证集和测试集上的准确率分别为96.5%、95.99%、96.05%,而隐藏层数增加到10时的准确率依次为95.41%、95.47%、95.14%,准确率反而有所下降。所以神经网络的层数并非越多越好,层数过多,对提升准确率并没有什么帮助,由此还有可能带来模型复杂、训练时间增加等不良后果。

增加神经元的数量

从上面可以知道,适当增加隐藏层可以提升准确率,那增加神经元的数量,是否可以提升准确率?让我们以数据说话:

从图中可以看出,神经元数量从32增加到128,准确率有非常明显的提升,但再往上增加神经元的数量,对准确率的提升就不那么明显了。与此同时,我们也需要了解到,增加模型的复杂性,运行时间也显著增加,因为有更多的参数需要优化。

这幅图显示了神经元数量与训练参数数量之间的关系。

从上图可以看到,随着神经元的增多,每次迭代所需的时间大幅增长。

小结一下,适当增加神经元的数量,对准确率提升有帮助,但也不是越大越好。

使用dropout策略

简单说,dropout策略就是随机丢弃一些神经元节点,不参与计算,为什么这种策略能够奏效,在Andrew NG的改善深层神经网络:超参数调试、正则化以及优化课程中有很清晰的讲解:

在keras中实现dropout策略非常简单,只需在隐藏层后面增加一个Dropout层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = Sequential()
model.add(Dense(N_HIDDEN, input_shape=(RESHAPE, )))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(N_HIDDEN))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(NB_CLASSES))
model.add(Activation('softmax'))

进行20次迭代,训练集上的准确率91.54%,验证集上为94.48%,测试集上为94.25%。注意这里训练集上的准确率低于测试集上的,说明训练的轮次不够。将训练轮次增加至250,准确率数据依次为98.1%、97.73%和97.7%。

由于引入了dropout策略,需要增加训练轮次,当然我们不能无限增加训练轮次,因为训练轮次增加,意味着训练时间的增加,还是用数据说话:

从图中可以看到,两条曲线在约250轮时相交,而这一点之后就有必要进一步训练了。

选择不同的优化器

在上面的代码中,我们使用了SGD优化器,SGD称为随机梯度下降(Stochastic Gradient Descent,SGD)。除了SGD,还有RMSprop和Adam这两种更先进的优化技术,它们引入了动量(速度分量)的概念,当然实现上更加复杂。不过在keras中,只是一行代码的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
OPTIMIZER = RMSprop()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
OPTIMIZER = Adam()

这是使用RMSprop优化器的曲线图,可以看到RMSprop比SGD快,在20次迭代后,在训练集上达到97.97%的准确率,验证集上97.59%,测试集上为97.84%。

这是使用Adam优化器的曲线图,效果更好一些,训练20轮之后,在训练集上的准确率达到了98.28%,验证集上达到了98.03%,测试集上达到了97.93%。

调整批次大小(BATCH_SIZE)

让我们修改一下BATCH_SIZE的大小,然后看看对准确率有和影响:

如图所示,BATCH_SIZE需要选择一个合适的值,对于本例而言,最优的准确率在BATCH_SIZE=128时取得。

采用更合适的模型结构

一步步提高手写数字的识别率(3)中,我们提到了一种提升手写数字识别率的模型:卷积神经网络CNN。对于图像相关的神经网络,通常卷积神经网络可以取得比全连接网络更好的效果,而对于文本处理、语音识别等,则循环神经网络RNN更加有效。

总结

本文仅仅从工程的角度探讨了如何提高模型性能,并给出了示例代码,在实际项目中,关于模型调优是一个很复杂的工程,需要从很多方面考量。本文也没有对其中涉及的理论有过多的深入,有兴趣的朋友推荐大家看一看Andrew NG的深度学习课程改善深层神经网络:超参数调试、正则化以及优化,在网易云课堂上是免费的课程。

参考
  1. Keras深度学习实战,Antonio Gulli/Sujit Pal,人民邮电出版社
  2. 改善深层神经网络:超参数调试、正则化以及优化,Andrew NG
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云水木石 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(数据科学学习手札44)在Keras中训练多层感知机
  Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更快捷的搭建自己的神经网络,堪称深度学习框架中的sklearn,本文就将基于Keras,以手写数字数据集MNIST为演示数据,对多层感知机(MLP)的训练方法进行一个基本的介绍,而关于多层感知机的相关原理,请移步数据科学学习手札34:https://www.cnblogs.com/feffery/p/8996623.html,本文不再赘述。
Feffery
2018/07/29
1.5K0
经典!构建你的第一个神经网络识别数字
在Keras环境下构建多层感知器模型,对数字图像进行精确识别。模型不消耗大量计算资源,使用了cpu版本的keras,以Tensorflow 作为backended,在ipython交互环境jupyter notebook中进行编写。 1.数据来源 在Yann LeCun的博客页面上下载开源的mnist数据库: http://yann.lecun.com/exdb/mnist/ 此数据库包含四部分:训练数据集、训练数据集标签、测试数据集、测试数据集标签。由于训练模型为有监督类型的判别模型,因此标签必不可少。若
IT派
2018/03/28
8500
经典!构建你的第一个神经网络识别数字
自己动手做一个识别手写数字的web应用01
最近在深入地学习keras,发现网上各种教程都是教你怎么训练模型的,很少有问题提到如何把训练好的模型部署为后端服务,为web及app提供服务。 于是,我决定把学习的过程完整的记录下来,帮大家更快地把深度学习的模型应用到实际场景中。 用到的技术: keras+tensorflow+flask 这个教程分为4篇。 第一篇 介绍开发环境--训练模型--保存至本地; 第二篇 介绍导入训练好的模型--识别任意的手写数字图片; 第三篇 介绍用Flask整合keras训练好的模型,并开发后端服务; 第四篇 介绍前端we
mixlab
2018/04/17
1.3K0
自己动手做一个识别手写数字的web应用01
【Keras篇】---Keras初始,两种模型构造方法,利用keras实现手写数字体识别
Keras 适合快速体验 ,keras的设计是把大量内部运算都隐藏了,用户始终可以用theano或tensorflow的语句来写扩展功能并和keras结合使用。
LhWorld哥陪你聊算法
2018/09/13
1.1K0
【Keras篇】---Keras初始,两种模型构造方法,利用keras实现手写数字体识别
神经网络与深度学习框架
神经网络和深度学习是当前人工智能领域的热门话题,尤其在图像识别、自然语言处理和语音识别等任务中,神经网络的应用取得了突破性进展。深度学习框架的出现使得构建和训练神经网络变得更加高效和便捷。本文将介绍神经网络的基本概念、如何构建基本的神经网络,并结合深度学习框架进行实现。
LucianaiB
2025/01/20
1190
基于Keras/Python的深度学习模型Dropout正则项
dropout技术是神经网络和深度学习模型的一种简单而有效的正则化方式。 本文将向你介绍dropout正则化技术,并且教你如何在Keras中用Python将其应用于你的模型。 读完本文之后,你将了解: dropout正则化的原理 如何在输入层使用dropout 如何在隐藏层使用dropout 如何针对具体问题对dropout调优 神经网络的Dropout正则化 Dropout是Srivastava等人在2014年的一篇论文中提出的一种针对神经网络模型的正则化方法 Dropou
CSDN技术头条
2018/02/12
1K0
关于深度学习系列笔记(一)
第一个深度学习笔记吧,看书有一阵子了,对理论知识仍然稀里糊涂的,不过一边实操一边记笔记一边查资料,希望逐步再深入到理论里去,凡事开头难,也不怕他人笑话。一般深度学习都是从手写数字识别开始的。
python与大数据分析
2022/03/11
3910
关于深度学习系列笔记(一)
Keras-深度学习-神经网络-手写数字识别模型
使用到的数据集为IMDB电影评论情感分类数据集,该数据集包含 50,000 条电影评论,其中 25,000 条用于训练,25,000 条用于测试。每条评论被标记为正面或负面情感,因此该数据集是一个二分类问题。
叶茂林
2023/07/30
2680
Keras-深度学习-神经网络-手写数字识别模型
Keras 学习笔记(三)Keras Sequential 顺序模型
你可以通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型:
种花家的奋斗兔
2020/11/12
2.4K0
用Keras进行深度学习模式的正则化方法:Dropout
Dropout是神经网络和深度学习模型的简单而有效的正则化技术。 在这篇文章中,你将发现Dropout正则化技术,以及如何使用Keras将其应用于Python中的模型。 看完这篇文章后,你会知道: D
AiTechYun
2018/03/02
1.3K0
用Keras进行深度学习模式的正则化方法:Dropout
一个超强算法模型,CNN !!
大概介绍下:MNIST数字分类项目旨在使用机器学习技术来构建一个模型,能够自动识别手写数字的图像。这个项目是一个经典的图像分类任务,常用于入门级机器学习和深度学习示例。我们会使用MNIST数据集,这个数据集包含了一系列28x28像素的手写数字图像,从0到9。项目的目标是训练一个模型,能够准确地将这些手写数字图像分类到正确的数字标签。
Python编程爱好者
2023/12/05
4030
一个超强算法模型,CNN !!
一文看懂迁移学习:怎样用预训练模型搞定深度学习?
瀚宸 编译自 Analytics Vidhya 量子位 出品 | 公众号 QbitAI 引言 跟传统的监督式机器学习算法相比,深度神经网络目前最大的劣势是什么? 贵。 尤其是当我们在尝试处理现实生活中诸如图像识别、声音辨识等实际问题的时候。一旦你的模型中包含一些隐藏层时,增添多一层隐藏层将会花费巨大的计算资源。 庆幸的是,有一种叫做“迁移学习”的方式,可以使我们在他人训练过的模型基础上进行小改动便可投入使用。在这篇文章中,我将会讲述如何使用预训练模型来加速解决问题的过程。 注:这篇文章默认读者对于神经网络和
量子位
2018/03/29
9.7K0
一文看懂迁移学习:怎样用预训练模型搞定深度学习?
基于Keras的imdb数据集电影评论情感二分类
二分类可能是机器学习最常解决的问题。我们将基于评论的内容将电影评论分类:正类和父类。
用户1631856
2018/08/01
4.2K1
基于Keras的imdb数据集电影评论情感二分类
从零到一构建AI项目实战教程第六篇:构建基础神经网络模型
在人工智能领域,多层感知机(Multilayer Perceptron,简称MLP)是一种基础且广泛使用的神经网络模型。MLP通过多层节点(神经元)之间的连接和权重调整,能够学习到输入数据与输出标签之间的复杂映射关系。本文将详细介绍如何构建和训练一个简单的MLP模型,并附带相关示例。
china马斯克
2025/01/16
2661
多层感知机(Multilayer Perceptron)
多层感知机(Multilayer Perceptron,简称MLP)是一种常见的人工神经网络模型,它在各个领域中都有广泛的应用。本文将介绍多层感知机的基本原理、网络结构和训练方法,并探讨其在实际问题中的应用。
大盘鸡拌面
2023/09/21
1.5K0
Keras介绍
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:
用户7886150
2021/02/14
1.2K0
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,常用于计算机视觉领域的图像分类、目标检测和图像分割任务中。它的核心思想是通过卷积运算从原始数据中提取特征,然后将这些特征传递给全连接层进行分类或回归。
MATRIX.矩阵之芯
2023/04/05
4140
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
深度学习进阶:神经网络优化技术全解析
神经网络是深度学习的核心,但训练一个高效、稳定的模型并非易事。优化技术直接影响模型的收敛速度、性能和泛化能力。本文将深入探讨神经网络优化中的关键方法,包括梯度下降变种、正则化、学习率调度等,并结合Python代码展示其实战效果。如果你已经掌握神经网络基础,想进一步提升模型性能,这篇教程将是你的进阶指南。欢迎在评论区分享你的优化经验!
DevKevin
2025/03/09
1650
TensorFlow 基础学习 - 4 (重点是调参)
简而言之:训练集就是用来告诉神经网络模型"这就是马的样子"、"这就是人的样子"等数据。
叉叉敌
2021/12/06
7640
TensorFlow 基础学习 - 4 (重点是调参)
Keras中神经网络模型的5阶段生命周期
使用Python的Keras库可以很容易创建和评测深度学习神经网络,但是您必须遵循严格的模型生命周期。
用户1161128
2018/02/05
3.1K0
推荐阅读
相关推荐
(数据科学学习手札44)在Keras中训练多层感知机
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档