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列表生成器的循环技巧分享
Mar 06 Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
python统计文本文件内单词数量的方法
May 30 Python
详解Django中的权限和组以及消息
Jul 23 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
Face++ API实现手势识别系统设计
Nov 21 Python
python3转换code128条形码的方法
Apr 17 Python
python函数的作用域及关键字详解
Aug 20 Python
Python xmltodict模块安装及代码实例
Oct 05 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
一个oracle+PHP的查询的例子
2006/10/09 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
javascript读取RSS数据
2007/01/20 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
js实现局部页面打印预览原理及示例代码
2014/07/03 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
JQuery 实现文件下载的常用方法分析
2019/10/29 jQuery
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python中尾递归用法实例详解
2015/04/28 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
python实现TCP文件传输
2020/03/20 Python
深入了解Python enumerate和zip
2020/07/16 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
C#面试题问题集
2016/04/02 面试题
大学学风建设方案
2014/05/04 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
pandas中pd.groupby()的用法详解
2022/06/16 Python