Keras SGD 随机梯度下降优化器参数设置方式


Posted in Python onJune 19, 2020

SGD 随机梯度下降

Keras 中包含了各式优化器供我们使用,但通常我会倾向于使用 SGD 验证模型能否快速收敛,然后调整不同的学习速率看看模型最后的性能,然后再尝试使用其他优化器。

Keras 中文文档中对 SGD 的描述如下:

keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)

随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量

参数:

lr:大或等于0的浮点数,学习率

momentum:大或等于0的浮点数,动量参数

decay:大或等于0的浮点数,每次更新后的学习率衰减值

nesterov:布尔值,确定是否使用Nesterov动量

参数设置

Time-Based Learning Rate Schedule

Keras 已经内置了一个基于时间的学习速率调整表,并通过上述参数中的 decay 来实现,学习速率的调整公式如下:

LearningRate = LearningRate * 1/(1 + decay * epoch)

当我们初始化参数为:

LearningRate = 0.1
decay = 0.001

大致变化曲线如下(非实际曲线,仅示意):

Keras SGD 随机梯度下降优化器参数设置方式

当然,方便起见,我们可以将优化器设置如下,使其学习速率随着训练轮次变化:

sgd = SGD(lr=learning_rate, decay=learning_rate/nb_epoch, momentum=0.9, nesterov=True)

Drop-Based Learning Rate Schedule

另外一种学习速率的调整方法思路是保持一个恒定学习速率一段时间后立即降低,是一种突变的方式。通常整个变化趋势为指数形式。

Keras SGD 随机梯度下降优化器参数设置方式

对应的学习速率变化公式如下:

LearningRate = InitialLearningRate * DropRate^floor(Epoch / EpochDrop)

实现需要使用 Keras 中的 LearningRateScheduler 模块:

from keras.callbacks import LearningRateScheduler
# learning rate schedule
def step_decay(epoch):
 initial_lrate = 0.1
 drop = 0.5
 epochs_drop = 10.0
 lrate = initial_lrate * math.pow(drop, math.floor((1+epoch)/epochs_drop))
 return lrate

lrate = LearningRateScheduler(step_decay)

# Compile model
sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False)
model.compile(loss=..., optimizer=sgd, metrics=['accuracy'])

# Fit the model
model.fit(X, Y, ..., callbacks=[lrate])

补充知识:keras中的BGD和SGD

关于BGD和SGD

首先BGD为批梯度下降,即所有样本计算完毕后才进行梯度更新;而SGD为随机梯度下降,随机计算一次样本就进行梯度下降,所以速度快很多但容易陷入局部最优值。

折中的办法是采用小批的梯度下降,即把数据分成若干个批次,一批来进行一次梯度下降,减少随机性,计算量也不是很大。 mini-batch

keras中的batch_size就是小批梯度下降。

以上这篇Keras SGD 随机梯度下降优化器参数设置方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
日常整理python执行系统命令的常见方法(全)
Oct 22 Python
python写日志文件操作类与应用示例
Jul 01 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
Jul 23 Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
Python常见反爬虫机制解决方案
Jun 01 Python
Python logging模块handlers用法详解
Aug 14 Python
python识别验证码的思路及解决方案
Sep 13 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
Sep 23 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Python 键盘事件详解
Nov 11 Python
python支持多继承吗
Jun 19 #Python
python和php哪个容易学
Jun 19 #Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 #Python
Python魔术方法专题
Jun 19 #Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 #Python
如何对python的字典进行排序
Jun 19 #Python
浅谈Python中的继承
Jun 19 #Python
You might like
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
PHP开发注意事项总结
2015/02/04 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
TP5框架请求响应参数实例分析
2019/10/17 PHP
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
javascript获取flash版本号的方法
2014/11/20 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
jquery判断页面网址是否有效的两种方法
2016/12/11 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
2016/12/26 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
创建echart多个联动的示例代码
2018/11/23 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
js中addEventListener()与removeEventListener()用法案例分析
2020/03/02 Javascript
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
python添加模块搜索路径方法
2017/09/11 Python
Python字符串格式化输出代码实例
2019/11/22 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
在python中使用nohup命令说明
2020/04/16 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
婚前协议书怎么写
2014/04/15 职场文书
售后服务质量承诺书
2015/04/29 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js