我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python人工智能tensorflow优化器Optimizer算法汇总

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python人工智能tensorflow优化器Optimizer算法汇总

前言

优化器的选择关乎参数更新的方法,合理的方法可以帮助机器学习更好的寻找到全局最佳值。
那我们快点开始学习吧

tensorflow常见的Optimizer

1 梯度下降法

tf.train.GradientDescentOptimizer(learning_rate, use_locking=False, name='GradientDescent')

常用参数为学习率learning_rate。

使用梯度下降算法的Optimizer,容易陷入局部最优解。

2 Adagrad下降法

tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False,name='Adagrad')

常用的参数为学习率learning_rate。

使用Adagrad算法的Optimizer,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。

Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0。

3 动量优化法

tf.train.MomentumOptimizer.__init__(learning_rate, momentum, use_locking=False, name='Momentum', use_nesterov=False)

常用的参数 learning_rate,momentum,use_nesterov使用Momentum算法的Optimizer使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD。

动量优化法的优点是收敛快,不容易陷入局部最优解,但是缺点是有时候会冲过头了,使得结果不够精确。

如果使得use_nesterov=True,则该优化器实现牛顿加速梯度(NAG, Nesterov accelerated gradient)算法,该算法是Momentum动量算法的变种。

4 RMSProp算法

tf.train.RMSPropOptimizer(learning_rate, decay=0.9, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp')

常用的参数由learning_rate

RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。

RMSProp算法在经验上已经被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。

5 Adam算法

tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')

常用的参数由learning_rate

Adam中动量直接并入了梯度一阶矩(指数加权)的估计。相比于缺少修正因子导致二阶矩估计可能在训练初期具有很高偏置的RMSProp,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩估计。

Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。
在实际运用中Adam效果非常优秀。

例子

本文以Mnist手写体识别为例子,将各个Optimizer在实际分类中进行运用,本例中,使用的神经网络是一个二层神经网络,每一层神经元均为150个,所用激励函数均为tf.nn.tanh()。

import tensorflow as tf 
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data",one_hot = "true")
def add_layer(inputs,in_size,out_size,n_layer,activation_function = None):
    layer_name = 'layer%s'%n_layer
    with tf.name_scope(layer_name):
        with tf.name_scope("Weights"):
            Weights = tf.Variable(tf.random_normal([in_size,out_size]),name = "Weights")
            tf.summary.histogram(layer_name+"/weights",Weights)
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name = "biases")
            tf.summary.histogram(layer_name+"/biases",biases)
        with tf.name_scope("Wx_plus_b"):
            Wx_plus_b = tf.matmul(inputs,Weights) + biases
            tf.summary.histogram(layer_name+"/Wx_plus_b",Wx_plus_b)
        if activation_function == None :
            outputs = Wx_plus_b 
        else:
            outputs = activation_function(Wx_plus_b)
        tf.summary.histogram(layer_name+"/outputs",outputs)
        return outputs
def compute_accuracy(x_data,y_data):
    global prediction
    y_pre = sess.run(prediction,feed_dict={xs:x_data})
    correct_prediction = tf.equal(tf.arg_max(y_data,1),tf.arg_max(y_pre,1))     #判断是否相等
    accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))   #赋予float32数据类型,求平均。
    result = sess.run(accuracy,feed_dict = {xs:batch_xs,ys:batch_ys})   #执行
    return result
xs = tf.placeholder(tf.float32,[None,784])
ys = tf.placeholder(tf.float32,[None,10])
layer1 = add_layer(xs,784,150,"layer1",activation_function = tf.nn.tanh)
prediction = add_layer(layer1,150,10,"layer2")
with tf.name_scope("loss"):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=ys,logits = prediction),name = 'loss')
    #label是标签,logits是预测值,交叉熵。
    tf.summary.scalar("loss",loss)
train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
init = tf.initialize_all_variables()
merged = tf.summary.merge_all()
with tf.Session() as sess:
    sess.run(init)
    write = tf.summary.FileWriter("logs/",sess.graph)
    for i in range(5001):
        batch_xs,batch_ys = mnist.train.next_batch(100)
        sess.run(train,feed_dict = {xs:batch_xs,ys:batch_ys})
        if i % 1000 == 0:
            print("训练%d次的识别率为:%f。"%((i+1),compute_accuracy(mnist.test.images,mnist.test.labels)))
            result = sess.run(merged,feed_dict={xs:batch_xs,ys:batch_ys})
            write.add_summary(result,i)

在该部分中,我主要只修改训练的Optimizer。

train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

1 梯度下降法

在该例子中,训练器为:

train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

得到结果:

训练1次的识别率为:0.119100。
训练1001次的识别率为:0.864600。
训练2001次的识别率为:0.889300。
训练3001次的识别率为:0.897400。
训练4001次的识别率为:0.905600。
训练5001次的识别率为:0.910200。

2 Adagrad下降法

在该例子中,训练器为:

train = tf.train.AdagradOptimizer(0.1).minimize(loss)

得到结果

训练1次的识别率为:0.136100。
训练1001次的识别率为:0.871600。
训练2001次的识别率为:0.894400。
训练3001次的识别率为:0.900500。
训练4001次的识别率为:0.909100。
训练5001次的识别率为:0.911600。

3 动量优化法

在该例子中,训练器为:

train = tf.train.MomentumOptimizer(learning_rate=0.05, momentum=0.9).minimize(loss)

得到结果

训练1次的识别率为:0.121300。
训练1001次的识别率为:0.894800。
训练2001次的识别率为:0.909400。
训练3001次的识别率为:0.916900。
训练4001次的识别率为:0.920700。
训练5001次的识别率为:0.927600。

4 RMSProp算法

在该例子中,训练器为:;

train = tf.train.RMSPropOptimizer(0.01).minimize(loss)

得到结果

训练1次的识别率为:0.071500。
训练1001次的识别率为:0.929500。
训练2001次的识别率为:0.944000。
训练3001次的识别率为:0.954100。
训练4001次的识别率为:0.953900。
训练5001次的识别率为:0.958000。

5 Adam算法

在该例子中,训练器为:

train = tf.train.AdamOptimizer(0.004).minimize(loss)

得到结果

训练1次的识别率为:0.103100。
训练1001次的识别率为:0.900700。
训练2001次的识别率为:0.928100。
训练3001次的识别率为:0.938900。
训练4001次的识别率为:0.945600。
训练5001次的识别率为:0.952100。

总结

在本例中,RMSProp算法和Adam算法在短时间内就得到了很好的训练效果,识别率都在95%以上,相比之下梯度下降法、Adagrad下降法和动量优化法表现较为逊色,但不能说明在任何情况下都是RMSProp算法和Adam算法比其它算法更加优秀,在实际应用中,选择哪种优化器应结合具体问题具体分析。

同时,也优化器的选择也取决于使用者对优化器的掌握情况,其中调节参数就是非常重要的一环,更多关于tensorflow优化器Optimizer的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python人工智能tensorflow优化器Optimizer算法汇总

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用Python理解人工智能优化算法

这篇文章给大家介绍如何用Python理解人工智能优化算法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 概述梯度下降是神经网络中流行的优化算法之一。一般来说,我们想要找到最小化误差函数的权重和偏差。梯度下降算法迭代地更
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录