Python-Tensorflow-优化器

简介: Python-Tensorflow-优化器

Optimizer


tensorflow中一共有如下几种optimizer:

tf.train.GradientDescentOptimizer:梯度下降法

tf.train.AdadeltaOptimizer

tf.train.AdagradOptimizer

tf.train.AdagradDAOptimizer

tf.train.MomentumOptimizer
tf.train.AdamOptimizer

tf.train.FtrlOptimizer

tf.train.ProximalGradientDescentOptimizer

tf.train.ProximalAdagradOptimizer

tf.train.RMSPropOptimizer

红色为常用


各种优化器对比:

标准梯度下降法:标准梯度下降先计算所有样本汇总误差,然后根据总误差来更新权值随机梯度下降法:随机梯度下降随机抽取一个样本来计算误差,然后更新权值批量梯度下降法:批量梯度下降算是一种折中的方案,从总样本中选取一个批次(比如一共有10000个样本,随机选取100个样本作为一个batch),然后计算这个batch的总误差,根据总误差来更新权值。

下图为一个梯度下降法的示意图:

W:要训练的参数     J(W):代价函数

即代价函数对W求导

SGD:随机梯度下降法

Momentum:

NAG(Nesterov acclerated gradient):

Adagrad:

基于随机梯度下降法。

观察公式,比如抽到的狗的照片越多,分母越大,学习率越小。

它很适合应用于数据稀疏的数据集

RMSprop:

RMS是均方根的缩写。(Root Mean Square)

Adadelta:

Adam:

更新参数的部分跟Adadelta和RMS类似。

各个优化器的特点:


SGD缺点


1,(正因为有这些缺点才让这么多大神发展出了后续的各种算法)选择合适的learning rate比较困难 - 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了

2,SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点

Momentum特点:


  1. 下降初期时,使用上一次参数更新,下降方向一致,乘上较大的能够进行很好的加速
  2. 下降中后期时,在局部最小值来回震荡的时候,使得更新幅度增大,跳出陷阱
  3. 在梯度改变方向的时候,能够减少更新 总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛

Nesterov:


  1. nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度

Adagrad特点:


  1. 前期GT较小的时候, regularizer较大,能够放大梯度
  2. 后期GT较大的时候,regularizer较小,能够约束梯度
  3. 适合处理稀疏梯度

缺点:


  1. 由公式可以看出,仍依赖于人工设置一个全局学习率
  2. 设置过大的话,会使regularizer过于敏感,对梯度的调节太大
  3. 中后期,分母上梯度平方的累加将会越来越大,使得训练提前结束

Adadelta特点:


  1. 训练初中期,加速效果不错,很快
  2. 训练后期,反复在局部最小值附近抖动

RMSprop特点:


  1. 其实RMSprop依然依赖于全局学习率
  2. RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
  3. 适合处理非平稳目标 - 对于RNN效果很好

Adam


     Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

特点:

  1. 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
  2. 对内存需求较小
  3. 为不同的参数计算不同的自适应学习率
  4. 也适用于大多非凸优化 - 适用于大数据集和高维空间

Adamax:学习率的边界范围更简单


Nadam:


          对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

经验之谈:


  • 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
  • SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
  • 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
  • Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
  • 在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果

八、优化器在TensorFlow中的应用


使用的代码基于交叉熵时的代码。

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
#读取mnist数据集 如果没有则会下载
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#每个批次的大小
batch_size = 100
#计算一共有多少批次
n_batch = mnist.train.num_examples // batch_size
#定义两个占位符
x = tf.placeholder(tf.float32,[None,784])
y = tf.placeholder(tf.float32,[None,10])
#创建简单的神经网络
#群值
W = tf.Variable(tf.zeros([784,10]))
#偏置值
b = tf.Variable(tf.zeros([10]))
#预测值
prediction = tf.nn.softmax(tf.matmul(x,W)+b)
#二次代价函数
#loss = tf.reduce_mean(tf.square(y-prediction))
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
#使用梯度下降法
#train_step = tf.train.GradientDescentOptimizer(0.3).minimize(loss)
train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)
#初始化变量
init = tf.global_variables_initializer()
#预测数据与样本比较,如果相等就返回1 求出标签
#结果存放在布尔型列表中
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
#进行训练
with tf.Session() as sess:
    sess.run(init)
    for i in range(21):#周期
        for batch in range(n_batch):#批次
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
        acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
        print("周期 :"+ str(i) + "准确率:" +  str(acc))

目录
相关文章
|
算法 TensorFlow 算法框架/工具
TensorFlow 常用优化器:GradientDescent、Momentum、Adam
TensorFlow 常用优化器:GradientDescent、Momentum、Adam
TensorFlow 常用优化器:GradientDescent、Momentum、Adam
|
人工智能 算法 机器人
AI学习笔记——Tensorflow中的Optimizer(优化器)
在使用Tensorflow搭建神经网络的时候,最后一步总会用到tf.train.XxxOptimizer(). 然后会有很多Optimizer()如下图 其实这些Optimizer 都是优化算法下面重点介绍几个常见的 1. Gradient Decent 这是最基础的梯度下降算法,更新权重W,不多解释。
1344 0
|
5月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
182 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
5月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
71 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
|
5月前
|
机器学习/深度学习 人工智能 TensorFlow
TensorFlow 是一个由 Google 开发的开源深度学习框架
TensorFlow 是一个由 Google 开发的开源深度学习框架
70 3
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
58 0
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
62 0
|
3月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
60 0
|
3月前
|
测试技术 数据库
探索JSF单元测试秘籍!如何让您的应用更稳固、更高效?揭秘成功背后的测试之道!
【8月更文挑战第31天】在 JavaServer Faces(JSF)应用开发中,确保代码质量和可维护性至关重要。本文详细介绍了如何通过单元测试实现这一目标。首先,阐述了单元测试的重要性及其对应用稳定性的影响;其次,提出了提高 JSF 应用可测试性的设计建议,如避免直接访问外部资源和使用依赖注入;最后,通过一个具体的 `UserBean` 示例,展示了如何利用 JUnit 和 Mockito 框架编写有效的单元测试。通过这些方法,不仅能够确保代码质量,还能提高开发效率和降低维护成本。
49 0
|
3月前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
59 0
下一篇
无影云桌面