TensorFlow基础(六)--TensorFlow中常用的优化器的对比与选择(Optimizer)

2023-11-16

1.优化器的作用

优化器是用来最小化损失函数的方法,也就是找到定义的模型中参数最优值的方法。开始你假定了模型中权重和偏置量的初始值,然后在每一次迭代中,参数值朝优化器指明的方向去更新,最终将会稳定到最优值。

2.常用的优化器(Optimizer)

tf.train.Optimizer
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.RMSPropOptimizer

3.各种优化器的对比

3.1三种梯度下降法的对比

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

在这里插入图片描述

符号 解释
W 要训练的参数
J(W) 代价函数
∇wJ(W) 代价函数的梯度
η 学习率

3.2 SGD(梯度下降)

在这里插入图片描述

3.3 Momentum

在这里插入图片描述
当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。这样,可以加快小球的向下的速度。

3.4 NAG(Nesterov accelerated gradient)

在这里插入图片描述NAG在TF中跟Momentum合并在同一个函数tf.train.MomentumOptimizer中,可以通过参数配置启用在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误,所以我们需要一个更聪明的小球,这个小球提前知道它要去哪里,它还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。γvt−1会用来修改W的值,计算W−γvt−1可以表示小球下一个位置大概在哪里。从而我们可以提前计算下一个位置的梯度,然后使用到当前位置。

3.5 Adagrad

在这里插入图片描述
它是基于SGD的一种算法,它的核心思想是对比较常见的数据给予它比较小的学习率去调整 参数,对于比较罕见的数据给予它比较大的学习率去调整参数。它很适合应用于数据稀疏的数据集(比如一个图片数据集,有10000张狗的照片,10000张猫的照片,只有100张大象的照 片)。
Adagrad主要的优势在于不需要人为的调节学习率,它可以自动调节。它的缺点在于,随着 迭代次数的增多,学习率也会越来越低,最终会趋向于0。

3.6 RMSprop

RMS(Root Mean Square)是均方根的缩写。
在这里插入图片描述
RMSprop借鉴了一些Adagrad的思想,不过这里RMSprop只用到了前t-1次梯度平方的平均值加上当前梯度的平方的和的开平方作为学习率的分母。这样RMSprop不会出现学习率越来 越低的问题,而且也能自己调节学习率,并且可以有一个比较好的效果。

3.7 Adadelta

在这里插入图片描述
使用Adadelta我们甚至不需要设置一个默认学习率,在Adadelta不需要使用学习率也可以达 到一个非常好的效果。

3.8 Adam

在这里插入图片描述
就像Adadelta和RMSprop一样,Adam会存储之前衰减的平方梯度,同时它也会保存之前衰减的梯度。经过一些处理之后再使用类似Adadelta和RMSprop的方式更新参数。

4.优化器的选择

为模型选择一个最好的优化器,收敛快并且能学到合适的权重和偏置量的值,是一个需要技巧的事情。
自适应技术(Adadelta,Adagrad等)对于复杂的神经网络模型来说是很好的优化器,收敛更快。大多数情况下,Adam可能是最好的优化器。Adam还优于其它的自适应技术,但是其计算成本很高。对于稀疏数据集来说(比如一个图片数据集,有10000张狗的照片,10000张猫的照片,只有100张大象的照 片),一些方法如SGD、NGA以及momentum不是最好的选择,能自适应调整学习率的方法才是。一个附加的好处就是不需要调整学习率,使用默认的学习率就可以达到最优解。

5.演示示例

还是以手写数字为例,设计一个简单神经网络,使用SGD、Adam两种优化器做对比:
代码修改部分:

#使用梯度下降法进行训练
#train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
#使用AdamOptimizer优化器训练
train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)

我们使用SGD的时候,学习率设为0.2,使用Adam的时候,学习率设为0.01,也就是1e-2。
一般我们使用Adam的时候,设置的学习率都比较小,这里0.01都算比较大的了。
完整代码如下:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

#载入数据集
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)

#每个批次的大小
batch_size = 100
#计算一共有多少个批次
n_batch = mnist.train.num_examples // batch_size

#定义两个placeholder
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))
#使用softmax交叉熵代价函数
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
#使用梯度下降法进行训练
#train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
#使用AdamOptimizer优化器训练
train_step = tf.train.AdamOptimizer(1e-2).minimize(loss)

#初始化变量
init = tf.global_variables_initializer()

#结果存放在一个布尔型列表中
#argmax返回一维张量中最大值所在的位置
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))
#求准确率
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:
    sess.run(init)
    for epoch 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("Iter"+str(epoch)+",Testing Accuracy"+str(acc))

使用SGD优化器结果:

Iter0,Testing Accuracy0.8243
Iter1,Testing Accuracy0.8882
Iter2,Testing Accuracy0.9009
Iter3,Testing Accuracy0.9052
Iter4,Testing Accuracy0.9089
Iter5,Testing Accuracy0.9103
Iter6,Testing Accuracy0.9111
Iter7,Testing Accuracy0.9128
Iter8,Testing Accuracy0.9145
Iter9,Testing Accuracy0.9158
Iter10,Testing Accuracy0.9192
Iter11,Testing Accuracy0.9181
Iter12,Testing Accuracy0.9184
Iter13,Testing Accuracy0.9191
Iter14,Testing Accuracy0.9195
Iter15,Testing Accuracy0.9196
Iter16,Testing Accuracy0.9212
Iter17,Testing Accuracy0.9213
Iter18,Testing Accuracy0.9204
Iter19,Testing Accuracy0.9213
Iter20,Testing Accuracy0.9211

使用Adam优化器结果:

Iter0,Testing Accuracy0.9244
Iter1,Testing Accuracy0.9256
Iter2,Testing Accuracy0.9298
Iter3,Testing Accuracy0.9262
Iter4,Testing Accuracy0.9275
Iter5,Testing Accuracy0.926
Iter6,Testing Accuracy0.9296
Iter7,Testing Accuracy0.9313
Iter8,Testing Accuracy0.9293
Iter9,Testing Accuracy0.929
Iter10,Testing Accuracy0.9305
Iter11,Testing Accuracy0.9326
Iter12,Testing Accuracy0.9307
Iter13,Testing Accuracy0.9328
Iter14,Testing Accuracy0.9295
Iter15,Testing Accuracy0.9324
Iter16,Testing Accuracy0.9282
Iter17,Testing Accuracy0.9328
Iter18,Testing Accuracy0.9297
Iter19,Testing Accuracy0.9325
Iter20,Testing Accuracy0.9297

结果分析
从结果来看,我们很可以看出来使用Adam的时候,收敛速度明显要比SGD要快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow基础(六)--TensorFlow中常用的优化器的对比与选择(Optimizer) 的相关文章

随机推荐

  • LLE原理及推导过程

    1 概述 所谓LLE 局部线性嵌入 即 Locally Linear Embedding 的降维算法 在处理所谓流形降维的时候 效果比PCA要好很多 首先 所谓流形 我们脑海里最直观的印象就是Swiss roll 在吃它的时候喜欢把它整个摊
  • 学习使用Shader处理纹理

    使用Shader处理纹理本是件简单的事情 但是我在尝试写一个简单的例子的时候却犯了个错误 导致郁闷了一天 这个稍后再说 先整理下怎么用Shader处理纹理吧 1 原理 用Shader处理纹理的原理其实很简单 将纹理通过一个uniform变量
  • 游戏王决斗连接显示服务器错误,游戏王决斗链接

    游戏王决斗链接公测常见问题一览 游戏王决斗链接最近也是正式公测啦 许多小伙伴在公测游玩中遇到了许多问题 下面就让小编带大家了解一下常见问题的解决方法吧 游戏王决斗链接公测常见问题 一 公测删档吗 不删档 决斗王链接在公测之前进行了好几次删档
  • windows修改mysql的my.ini文件导致服务启动失败

    windows修改mysql的my ini文件导致服务启动失败 解决 my ini的编码格式为ANSI 当我在服务器电脑直接打开编辑然后保存 默认保存的编码格式utf 8 所以导致启动失败
  • 期货开户用心服务每个客户

    用心服务每一个客户 以信为本 点石成金 蓄之既久 其发必速 如果价格连续多天在 个狭窄的幅度内升降 在图表上形成一幅有如建筑地盘布满地基桩的图景 习惯上称之为密集区 亦即专家所说的技术支持区 这个密集区一旦向上突破或向下突破 就会造成一个烈
  • C语言输出指针变量地址(十六进制)

    include
  • 微信小程序使用canvas绘制二维码实现跳转小程序

    开始接到这个需求的时候 我查阅文档获取小程序码 微信开放文档 发现两种途径 需要后端在服务器上调用接口拿到二维码 因为调用的 https api weixin qq com这个域名是不允许上白名单 或者是云开发 显然他们不需要云开发 这时候
  • C++ if 语句

    一个 if 语句 由一个布尔表达式后跟一个或多个语句组成 语法 C 中 if 语句的语法 if boolean expression 如果布尔表达式为真将执行的语句 如果布尔表达式为 true 则 if 语句内的代码块将被执行 如果布尔表达
  • Unity上玩转数字人(Avatar)

    现在数字人越来越有趣了 现在好多公司都在做 那我也想在Unity玩转一下 怎么玩呢 1 数字人准备以及跳舞动画 首先我们需要有数字人资源 数字人资源从哪来呢 第一你可以直接去Unity assetstore上去搜一下免费的数字人 有2个还是
  • C# 网络编程之获取本机名、ip地址、域名、物理位置

    在C 网络编程中 主机域名与ip之间能相互转换 同时DNS中有Dns类 IPHostEntry类 IPAddress类 DnsPermission类实现DNS的一些简单功能 下面主要讲述一个C 的Windows应用程序 实现以下功能 1 获
  • git 和 svn

    在对比集中式版本控制svn和分布式的版本控制git的时候可能会有一些疑问 例如 git 不联网可以使用吗 集中式版本控制系统的好处是什么 以下总结了一些问题的对比 都是个人理解 如有不正确的请指正 设计思路 git 分布式的核心设计是同步
  • C++学习练习 之文件操作

    C 学习练习 之文件操作 程序运行时产生的数据都属于临时数据 程序一旦运行结束 都会被释放 通过文件可以将数据持久化 C 中对文件操作需要包含头文件 lt fstream gt 文件类型分为两种 1 文本文件 文件以文本的ASCII码形式存
  • Java基础--IO操作

    一 IO原理及分类 一 IO原理 1 I O是Input Output的缩写 I O技术是非常实用的技术 用于处理设备之间的数据传输 如读写文件 网络通信等 2 java程序中对于数据的输入 输出操作一般都是以流的方式进行 3 java i
  • 2023华为OD机试真题 Python【报文回路】

    题目 在 IGMP 协议中 存在两种重要的报文 查询报文和响应报文 这两种报文负责维持组播通路 在一个通路中 ROUTER 会定期给 HOST 发送查询报文 收到查询报文的 HOST 应该回复一个响应报文 从而保持两者的连接状态 如果某个
  • Emojify – Create your own emoji with Deep Learning 通过深度学习创建你自己的表情

    全文总览 本文目的 原文链接 我的电脑环境 数据集下载 代码下载 本文目的 深度学习初级项目 Emojify Create your own emoji with Deep Learning 通过深度学习创建你自己的表情 本文旨在描述源代码
  • 华为OD机试 - 需要打开多少监控器(Java & C)

    题目描述 某长方形停车场 每个车位上方都有对应监控器 当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时 监控器才需要打开 给出某一时刻停车场的停车分布 请统计最少需要打开多少个监控器 输入描述 第一行输入m n表示长宽 满足1
  • Vscode代码量统计

    Vscode代码量统计 安装vscode扩展插件 开始统计 结果 安装vscode扩展插件 插件商城中搜索 VS Code Counter 开始统计 安装完毕后 重新加载vscode 快捷键ctrl shift p输入指令 结果
  • angular中@ViewChild、@ViewChildren的使用

    ViewChild和 ViewChildren会在父组件钩子方法ngAfterViewInit调用之前赋值 获取DOM节点 1 在html中给DOM节点设置一个模板应用变量myBox div 我是一个div div 2 在js中引入View
  • nvm安装完node后确无法使用node和npm

    问题 nvm安装了两个node版本后 使用use切换到指定版本 确还是不能使用node和npm 解决办法 找到nvm得安装位置 打开setting配置文件发现node的位置是错误的 两个版本的node都是安装在nvm文件夹下的 所以修改配置
  • TensorFlow基础(六)--TensorFlow中常用的优化器的对比与选择(Optimizer)

    目录 1 优化器的作用 2 常用的优化器 Optimizer 3 各种优化器的对比 3 1三种梯度下降法的对比 3 2 SGD 梯度下降 3 3 Momentum 3 4 NAG Nesterov accelerated gradient