前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MLK | Keras 基础模型调参指南

MLK | Keras 基础模型调参指南

作者头像
Sam Gor
发布于 2019-08-09 09:23:50
发布于 2019-08-09 09:23:50
1.2K00
代码可运行
举报
文章被收录于专栏:SAMshareSAMshare
运行总次数:0
代码可运行
MLK,即Machine Learning Knowledge,本专栏在于对机器学习的重点知识做一次梳理,便于日后温习,这次主要讲下Keras 模型的调参。

? 前情回顾

MLK | 那些常见的特征工程

MLK | 模型评估的一些事

MLK | 机器学习的降维”打击“

MLK | 非监督学习最强攻略

MLK | 机器学习采样方法大全

MLK | 一文理清 深度学习前馈神经网络

MLK | Keras 入门深度学习逢看必会

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

00- 初始化一个NN模型

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入相关库
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense,Dropout,Activation
from keras.optimizers import SGD,Adam
from keras.utils import np_utils
from 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 。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
修改下 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才算结束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
增大 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的值,效率会变慢很多,但效果还蛮不错。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''减小 batch_size'''
model.fit(x_train,y_train, batch_size=10, epochs=20)

03- deep layer 入手

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
增加隐含层数量至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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
修改下 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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.compile(loss='categorical_crossentropy',
              optimizer='Adam',
              metrics=['accuracy'])
output:

效果还是蛮不错的。

06- Dropout 入手

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
修改下 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节

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAMshare 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MLK | Keras 入门深度学习逢看必会
Keras作为深度学习工具,对于 初学者还是蛮友好的,在安装前,我们要知道Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。因此我们安装Keras前,就必须安装相关的依赖包。
Sam Gor
2019/08/09
6830
MLK | Keras 入门深度学习逢看必会
笔记|李宏毅老师机器学习课程,视频15Keras Demo
感谢李宏毅老师的分享,他的课程帮助我更好地学习、理解和应用机器学习。李老师的网站:http://speech.ee.ntu.edu.tw/~tlkagk/index.html。这个学习笔记是根据李老师2017年秋季机器学习课程的视频和讲义做的记录和总结。
陆勤_数据人网
2021/04/22
4080
Keras 学习笔记(三)Keras Sequential 顺序模型
你可以通过将网络层实例的列表传递给 Sequential 的构造器,来创建一个 Sequential 模型:
种花家的奋斗兔
2020/11/12
2.4K0
基于keras的手写数字识别_数字识别
Flatten层: Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡,举例如下
全栈程序员站长
2022/10/05
2K0
【小白学习keras教程】二、基于CIFAR-10数据集训练简单的MLP分类模型
「@Author:Runsen」 分类任务的MLP 当目标(「y」)是离散的(分类的) 对于损失函数,使用交叉熵;对于评估指标,通常使用accuracy 数据集描述 CIFAR-10数据集包含10个类中的60000个图像—50000个用于培训,10000个用于测试 有关更多信息,请参阅官方文档 from tensorflow.keras.datasets import cifar10 from tensorflow.keras.utils import to_categorical # load data
润森
2022/08/18
5620
【小白学习keras教程】二、基于CIFAR-10数据集训练简单的MLP分类模型
深度学习|中文文本的分类(建模篇)
前言 上回我们处理好了中文文本,具体的步骤如下: 数据情况 中文文本分词 建立token token转换为列表 统一长度 那这篇文章我们就使用MLP和LSTM模型来训练我们的数据。 MLP建模 模型结构 嵌入层:用于转换为向量列表(NLP知识点) 平坦层 隐藏层 输出层 建立模型 from keras.models import Sequential from keras.layers import Dense,Dropout,Embedding,Flatten model = Sequential()
罗罗攀
2019/02/26
6210
Keras框架速查手册(Python For Data Science Cheat Sheet Keras)
Keras框架速查表 1 Keras 1.1 一个基本示例 2 数据 2.1 Keras数据设置 3 模型结构 3.1 Sequential模型 3.2 多层感知器(MLP) 3.2.1 二元分类 3.2.2 多类别分类 3.2.3 回归 3.3 卷积神经网络(CNN) 3.4 循环神经网络(RNN) 4 预处理 4.1 序列填充 4.2 创建虚拟变量 4.3 训练集、测试集分离 4.4 标准化/归一化 5 模型细节提取 5.1 模型输出形状 5.2 模型总结 5.3 get模型参数 5.4 g
荣仔_最靓的仔
2022/01/05
3900
Keras框架速查手册(Python For Data Science Cheat Sheet Keras)
Keras介绍
Keras是一个高层神经网络API,Keras由纯Python编写而成并基Tensorflow、Theano以及CNTK后端。Keras 为支持快速实验而生,能够把你的idea迅速转换为结果,如果你有如下需求,请选择Keras:
用户7886150
2021/02/14
1.2K0
Keras-深度学习-神经网络-手写数字识别模型
使用到的数据集为IMDB电影评论情感分类数据集,该数据集包含 50,000 条电影评论,其中 25,000 条用于训练,25,000 条用于测试。每条评论被标记为正面或负面情感,因此该数据集是一个二分类问题。
叶茂林
2023/07/30
2890
Keras-深度学习-神经网络-手写数字识别模型
Keras 训练简单的深度神经网络
机器学习训练营最近的作业都是使用Keras,所以最近去翻了下文档,这里记录一下学习栗子。(官网有中文文档)
小歪
2018/12/13
8340
关于深度学习系列笔记(一)
第一个深度学习笔记吧,看书有一阵子了,对理论知识仍然稀里糊涂的,不过一边实操一边记笔记一边查资料,希望逐步再深入到理论里去,凡事开头难,也不怕他人笑话。一般深度学习都是从手写数字识别开始的。
python与大数据分析
2022/03/11
4050
关于深度学习系列笔记(一)
(数据科学学习手札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-深度学习-神经网络-电影评论情感分析模型
使用到的数据集为IMDB电影评论情感分类数据集,该数据集包含 50,000 条电影评论,其中 25,000 条用于训练,25,000 条用于测试。每条评论被标记为正面或负面情感,因此该数据集是一个二分类问题。
叶茂林
2023/07/30
3790
Keras-深度学习-神经网络-电影评论情感分析模型
深度学习入门(一),从Keras开始
安装环境:Anaconda(python3.6) 首先安装:tensorflow.(通过navigator,可参见直通车) 检验:import tensorflow as tf Keras在anaconda下没有原装的安装包,只有使用pip安装方式,安装Keras,pip install Keras
学到老
2019/01/25
2.2K0
深度学习入门(一),从Keras开始
Keras 学习笔记(一)编码与简单快速上手
简单来说,to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。其表现为将原有的类别向量转换为独热编码的形式。先上代码看一下效果:
种花家的奋斗兔
2020/11/13
4100
【Keras】Keras入门指南
在用了一段时间的Keras后感觉真的很爽,所以特意祭出此文与我们公众号的粉丝分享。 Keras是一个非常方便的深度学习框架,它以TensorFlow或Theano为后端。用它可以快速地搭建深度网络,灵活地选取训练参数来进行网路训练。总之就是:灵活+快速!
keloli
2018/09/13
2.1K0
使用Keras创建一个卷积神经网络模型,可对手写数字进行识别
在过去的几年里,图像识别研究已经达到了惊人的精确度。不可否认的是,深度学习在这个领域击败了传统的计算机视觉技术。 将神经网络应用于MNIST的数据集以识别手写的数字这种方法将所有的图像像素传输到完全连接的神经网络。该方法在测试集上的准确率为98.01%。这个成功率虽然看上去不错,但不是完美的。 应用卷积神经网络可以产生更成功的结果。与传统的方法相比,重点部分的图像像素将被传输到完全连接的神经网络,而不是所有的图像像素。一些滤镜应该被应用到图片中去检测重点部分的像素。 Keras是一个使用通用深度学习框架的A
AiTechYun
2018/03/02
1K0
使用Keras创建一个卷积神经网络模型,可对手写数字进行识别
数据科学 IPython 笔记本 四、Keras(下)
为了节省时间,你可以采样一个观测子集(例如 1000 个),这是你选择的特定数字(例如 6)和 1000 非特定数字的观察值(即非 6)。我们将使用它构建一个模型,并查看它在测试数据集上的表现。
ApacheCN_飞龙
2022/05/07
8760
数据科学 IPython 笔记本 四、Keras(下)
机器学习 | 四大常用机器学习Python库介绍
今天这篇我们介绍下Python中常用的机器学习库(机器学习、深度学习啥的,小编还是建议使用Python进行建模编写哈),也算是本公号机器学习的第一篇推文,主要内容如下:
DataCharm
2021/03/11
5.1K0
机器学习 | 四大常用机器学习Python库介绍
使用python实现图像识别
图像识别是人工智能中的重要分支之一,通过使用机器学习算法来训练模型,使其能够识别图像中的物体、场景或人脸等。在本文中,我们将介绍使用Python实现图像识别的方法,其中主要使用的是深度学习框架Keras和OpenCV库。
堕落飞鸟
2023/03/27
12.4K1
推荐阅读
相关推荐
MLK | Keras 入门深度学习逢看必会
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验