MLK,即Machine Learning Knowledge,本专栏在于对机器学习的重点知识做一次梳理,便于日后温习,这次主要讲下Keras 模型的调参。

? 前情回顾

上一篇文章讲解了如何简易入门Keras,大致给出了一个深度学习模型,但对于模型如何调参就没有太过于深入讲解,今天继续写一篇文章来整理下 Keras 深度学习模型的调参教程,希望可以对大家有所帮助。

00- 初始化一个NN模型

我们还是使用 MNIST 数据集,这一次训练和测试数据的样本量都一样,都是10000。

# 导入相关库import numpy as npfrom keras.models import Sequentialfrom keras.layers.core import Dense,Dropout,Activationfrom keras.optimizers import SGD,Adamfrom keras.utils import np_utilsfrom keras.datasets import mnist

# 封装数据读取及预处理的代码def load_data():    (x_train,y_train),(x_test,y_test)=mnist.load_data()    number=10000    x_train=x_train[0:number]    y_train=y_train[0:number]    x_train=x_train.reshape(number,28*28)    x_test=x_test.reshape(x_test.shape[0],28*28)    x_train=x_train.astype('float32')    x_test=x_test.astype('float32')    y_train=np_utils.to_categorical(y_train,10)    y_test=np_utils.to_categorical(y_test,10)    x_train=x_train    x_test=x_test    x_train=x_train/255    x_test=x_test/255    return (x_train,y_train),(x_test,y_test)

# 调用方法(x_train,y_train),(x_test,y_test)=load_data()print(x_train.shape)print(x_test.shape)

'''随便初始化一个NN模型'''model=Sequential()model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))model.add(Dense(units=633,activation='sigmoid'))model.add(Dense(units=633,activation='sigmoid'))model.add(Dense(units=10,activation='softmax'))

model.compile(loss='mse',optimizer=SGD(lr=0.1),metrics=['accuracy'])

model.fit(x_train,y_train,batch_size=100,epochs=20)

train_result = model.evaluate(x_train,y_train,batch_size=10000)test_result = model.evaluate(x_test,y_test)

print('TRAIN Accuracy:',train_result[1])print('TEST Accuracy:',test_result[1])

output:

可以看出结果还是很烂的,Train 和 Test都只是有13%左右的准确度。

01- Loss Function 入手

尝试着从损失函数开始入手,原模型参数的Loss Function为 MSE,如果对损失函数的原理比较清晰的同学可能就会发现了问题,MSE为均方误差,往往都是用于线性回归的损失函数,而这里是多分类问题,当然就不是十分适合了,所以我们可以换成 categorical_crossentropy 。

'''修改下 Loss Function'''model=Sequential()model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))model.add(Dense(units=633,activation='sigmoid'))model.add(Dense(units=633,activation='sigmoid'))model.add(Dense(units=10,activation='softmax'))

model.compile(loss='categorical_crossentropy',              optimizer=SGD(lr=0.1),              metrics=['accuracy'])

model.fit(x_train,y_train,          batch_size=100,          epochs=20)

train_result = model.evaluate(x_train,y_train)test_result = model.evaluate(x_test,y_test)

print('TRAIN Accuracy:',train_result[1])print('TEST Accuracy:',test_result[1])

output:

可以看出,换了合适的Loss Function,模型效果有了很大的提升,看来机器学习还是需要懂些理论知识的,不然盲目调参并不是明智的选择。

02- batch_size 入手

这个参数在Keras深度学习模型中还是蛮重要的,我们在深度学习模型中做 梯度下降,并不是真的就是 minimize total loss(最小化总损失),而通常的做法是会把训练数据随机分成 N 个 mini-batch,并行训练模型。在了解这个参数前,先介绍下 mini-batch 的原理。

Mini-batch 指的是从一堆训练数据中,随机取出 N/batch_size 个数据来计算偏微分并更新参数,可以参考下面的步骤:

1)随机初始化神经网络的参数(与 Stochastic gradient descent一样)

2)随机选择第一个batch,计算其 loss,计算偏微分,根据 L` 更新参数

3)继续随机选择一个batch,计算其 loss,计算偏微分,根据 L`` 更新参数

4)重复上述2-3步,直到所有的batch都被更新了一次,一个epoch才算结束

'''增大 batch_size'''model=Sequential()model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))model.add(Dense(units=633,activation='sigmoid'))model.add(Dense(units=633,activation='sigmoid'))model.add(Dense(units=10,activation='softmax'))

model.compile(loss='categorical_crossentropy',              optimizer=SGD(lr=0.1),              metrics=['accuracy'])

model.fit(x_train,y_train,          batch_size=1000,          epochs=20)

train_result = model.evaluate(x_train,y_train)test_result = model.evaluate(x_test,y_test)

print('TRAIN Accuracy:',train_result[1])print('TEST Accuracy:',test_result[1])

output:

设置太大的batch_size,训练效率是超级快了,但是效果却很差。而按照batch_size的原理,如果减小batch_size的值,效率会变慢很多,但效果还蛮不错。

'''减小 batch_size'''model.fit(x_train,y_train, batch_size=10, epochs=20)

03- deep layer 入手

所谓深度学习,正常来说“越深越好”,但也要看实际情况,太深的话其实对资源的消耗也很大,同时也不一定可以得到比较好的结果,也就是所谓的“性价比低”。先前的隐含层都只有2层,下面我们用for循环增加隐含层到 10 层 ,看看效果。

'''增加隐含层数量至10'''model=Sequential()model.add(Dense(input_dim=28*28,units=633,activation='sigmoid'))

for _ in range(10):    model.add(Dense(units=633,activation='sigmoid'))

model.add(Dense(units=10,activation='softmax'))

model.compile(loss='categorical_crossentropy',              optimizer=SGD(lr=0.1),              metrics=['accuracy'])

model.fit(x_train,y_train,          batch_size=100,          epochs=20)

train_result = model.evaluate(x_train,y_train)test_result = model.evaluate(x_test,y_test)

print('TRAIN Accuracy:',train_result[1])print('TEST Accuracy:',test_result[1])

output:

效果是出奇的差,从原先的85%左右掉到11%左右,于是我试着变少一些,比如3层、5层什么的,效果也都还是不行,看来并不是盲目地增加隐含层数量来提升效果的哦。

04- activation function 入手

这里是激活函数,还是建议阅读先前的理论文章《MLK | 一文理清 深度学习前馈神经网络》,看下几种激活函数的差异,主要有Sigmoid、Tanh、ReLU激活函数,这里我把 Sigmoid都换成了 relu。

'''修改下 Loss Function'''model=Sequential()model.add(Dense(input_dim=28*28,units=633,activation='relu'))

for _ in range(2):    model.add(Dense(units=633,activation='relu'))

model.add(Dense(units=10,activation='softmax'))

model.compile(loss='categorical_crossentropy',              optimizer=SGD(lr=0.1),              metrics=['accuracy'])

model.fit(x_train,y_train,          batch_size=100,          epochs=20)

train_result = model.evaluate(x_train,y_train)test_result = model.evaluate(x_test,y_test)

print('TRAIN Accuracy:',train_result[1])print('TEST Accuracy:',test_result[1])

output:

效果杠杠的,可以达到95%+了。

05- optimizer 入手

优化器的选择有好多种,比如我们一开始用的 SGD,除此之外还有:Adam、RMSprop、Adagrad、Adamax、Nadam,这些都是gradient descent的变形体,我们换另一个优化器看看,比如Adam:

model.compile(loss='categorical_crossentropy',              optimizer='Adam',              metrics=['accuracy'])

output:

效果还是蛮不错的。

06- Dropout 入手

dropout其实就是为了减少过拟合情况,是最简单的神经网络正则化方法,可以应用于输入层和隐含层,取值在0-1之间,一般会在0.2-0.7之间比较好。

'''修改下 Dropout'''model=Sequential()model.add(Dense(input_dim=28*28,units=633,activation='relu'))model.add(Dropout(0.7))

for _ in range(2):    model.add(Dense(units=633,activation='relu'))    model.add(Dropout(0.7))

model.add(Dense(units=10,activation='softmax'))

model.compile(loss='categorical_crossentropy',              optimizer='Adam',              metrics=['accuracy'])

model.fit(x_train,y_train,          batch_size=100,          epochs=20)

train_result = model.evaluate(x_train,y_train)test_result = model.evaluate(x_test,y_test)

print('TRAIN Accuracy:',train_result[1])print('TEST Accuracy:',test_result[1])

output:

我拿的是上面小节的代码,加了0.7的Dropout,效果有所下降,但确实Train和Test的差距会变小很多。

References

[1] 【Keras】减少过拟合的秘诀——Dropout正则化

https://www.jianshu.com/p/3745827decdf

[2] 台大 李宏毅机器学习 19节

MLK | Keras 基础模型调参指南相关推荐

  1. 机器学习模型调参指南(附代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 ML工作流中最困难的部分之一是为模型找到最好的超参数.ML模 ...

  2. XGBoost-Python完全调参指南-参数解释篇

    本文转自XGBoost-Python完全调参指南-参数解释篇.对XGBoost有需要小伙伴可以参看.并在此基础上,添加了一些内容. 在analytics vidhya上看到一篇<Complete ...

  3. DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优

    DL之模型调参:深度学习算法模型优化参数之对LSTM算法进行超参数调优 目录 基于keras对LSTM算法进行超参数调优 1.可视化LSTM模型的loss和acc曲线

  4. px4官网调参指南 多旋翼无人机PID调参指南

    译文部分: 多旋翼无人机PID调参指南 不用碳化纤维或增强碳化纤维桨调整多轴,不使用损坏的桨片. 出于安全考虑,系统默认增益都设置的比较小.请增加增益以便获取更好的控制响应. 本指导方案适用于所有的多 ...

  5. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  6. TensorFlow使用Keras Tuner自动调参

    TensorFlow使用Keras Tuner自动调参 数据集 归一化 图像分类模型 Hyperband 运行超参数搜索(自动调参) 获取最佳超参数 使用最佳超参数构建和训练模型 整体代码 代码地址: ...

  7. px4官网调参指南 多旋翼无人机PID调参指南

    译文部分: 多旋翼无人机PID调参指南 不用碳化纤维或增强碳化纤维桨调整多轴,不使用损坏的桨片. 出于安全考虑,系统默认增益都设置的比较小.请增加增益以便获取更好的控制响应. 本指导方案适用于所有的多 ...

  8. 比xgboost强大的LightGBM:调参指南(带贝叶斯优化代码)

    向AI转型的程序员都关注了这个号??? 大数据挖掘DT数据分析  公众号: datadw xgboost的出现,让数据民工们告别了传统的机器学习算法们:RF.GBM.SVM.LASSO........ ...

  9. lgg7深度详细参数_机器学习超详细实践攻略(9):决策树算法使用及小白都能看懂的调参指南...

    决策树算法在工业中本身应用并不多,但是,目前主流的比赛中的王者,包括GBDT.XGBOOST.LGBM都是以决策树为积木搭建出来的,所以理解决策树,是学习这些算法的基石,今天,我们就从模型调用到调参详 ...

最新文章

  1. scrapy 模块功能流程--转
  2. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )
  3. java文件和xml文件_用Java分割大型XML文件
  4. maven学习(1)
  5. 权限不足_十分钟掌握Linux文件属性及权限操作,不再担心权限不足!
  6. PostgreSQL GPU 加速(HeteroDB pg_strom) (GPU计算, GPU-DIO-Nvme SSD, 列存, GPU内存缓存)
  7. can not find Artifact XXX 的原因
  8. JavaWeb初级篇-HttpPost使用教程
  9. 解决无法下载安装Android SDK的问题
  10. 如何隐藏电脑下方工具栏个别图标_电脑下方隐藏小图标怎么设置
  11. React脚手架开发
  12. 规培手册填写模板_肾内科 规培轮转登记手册模板
  13. Python--判断一个数字的奇偶性
  14. 使用Arduino的自动药物提醒
  15. hr面试性格测试30题_HR性格测试题.doc
  16. vue封装了个日历组件(包含农历,节日)
  17. 数学小课堂:库尔贝勒交叉熵(K-L divergence,也叫KL散度)【量化度量错误预测所要付出的成本,避免制订出与事实相反的计划】
  18. canvas实现简单的画图功能
  19. ENVI|一天一个小技能|APP STORE浏览并下载矢量数据
  20. 【Android开发】App消息中心构建

热门文章

  1. 联合解决方案|亚信科技AntDB携手蓝凌软件,助推企业数字化办公转型升级
  2. 戴尔OptiPlex商务台式机限时5折起,助力小企业加速成长!
  3. 快来直播:物联网在电子商务行业中的重要性
  4. virsh 创建一个虚拟交换机,虚拟网络
  5. Python绘制白羊座卡通
  6. word2016开机后首次打开非常慢_如何有效地提升电脑开机速速?4招让你10秒开机不是梦...
  7. ARTS挑战第十九周
  8. Pix2Pix和CycleGAN
  9. 你曾经注意如何快乐人是当他们最后拿一个相似但不同的脸?
  10. JDK8安装和环境配置