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实现将n个点均匀地分布在球面上的方法
Mar 12 Python
在Python中操作文件之read()方法的使用教程
May 24 Python
python获得一个月有多少天的方法
Jun 04 Python
Python入门_浅谈数据结构的4种基本类型
May 16 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
Aug 09 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
python切片作为占位符使用实例讲解
Feb 17 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中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
js实现在字符串中提取数字
2013/11/05 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
整理Javascript事件响应学习笔记
2015/12/02 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
vue购物车插件编写代码
2017/11/27 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
Python中多线程及程序锁浅析
2015/01/21 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
查看Django和flask版本的方法
2018/05/14 Python
解决django前后端分离csrf验证的问题
2019/02/03 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
介绍一下linux的文件权限
2012/02/15 面试题
房地产开盘策划方案
2014/02/10 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
晚自修旷课检讨书怎么写
2014/11/17 职场文书
家长会欢迎词
2015/01/23 职场文书
《认识年月日》教学反思
2016/02/19 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang