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实现简单的TCP代理服务器
Oct 08 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
python打开文件并获取文件相关属性的方法
Apr 23 Python
Python实现简单HTML表格解析的方法
Jun 15 Python
详解Django中的过滤器
Jul 16 Python
深入理解python多进程编程
Jun 12 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
python实现视频读取和转化图片
Dec 10 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
Python turtle编写简单的球类小游戏
Mar 31 Python
Python 绘制多因子柱状图
May 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简单压缩css样式示例
2016/09/22 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
jQuery 获取对象 定位子对象
2010/05/31 Javascript
JavaScript中的Math.LN2属性用法详解
2015/06/12 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
几种tab切换详解
2017/02/03 Javascript
nodejs个人博客开发第五步 分配数据
2017/04/12 NodeJs
基于JSONP原理解析(推荐)
2017/12/04 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
2020/07/20 Javascript
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
建筑总经理岗位职责
2014/02/02 职场文书
新农村建设标语
2014/06/24 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
师范生见习报告
2014/10/31 职场文书
单位工资证明范本
2015/06/12 职场文书
孩子满月酒答谢词
2015/09/30 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android