欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python人工智能tensorflow優(yōu)化器Optimizer算法匯總

 更新時(shí)間:2022年05月05日 12:07:28   作者:Bubbliiiing  
這篇文章主要為大家介紹了python人工智能tensorflowtf優(yōu)化器Optimizer算法匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

優(yōu)化器的選擇關(guān)乎參數(shù)更新的方法,合理的方法可以幫助機(jī)器學(xué)習(xí)更好的尋找到全局最佳值。
那我們快點(diǎn)開始學(xué)習(xí)吧

tensorflow常見的Optimizer

1 梯度下降法

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

常用參數(shù)為學(xué)習(xí)率learning_rate。

使用梯度下降算法的Optimizer,容易陷入局部最優(yōu)解。

2 Adagrad下降法

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

常用的參數(shù)為學(xué)習(xí)率learning_rate。

使用Adagrad算法的Optimizer,獨(dú)立地適應(yīng)所有模型參數(shù)的學(xué)習(xí)率,縮放每個(gè)參數(shù)反比于其所有梯度歷史平均值總和的平方根。具有代價(jià)函數(shù)最大梯度的參數(shù)相應(yīng)地有個(gè)快速下降的學(xué)習(xí)率,而具有小梯度的參數(shù)在學(xué)習(xí)率上有相對較小的下降。

Adagrad 的主要優(yōu)勢在于不需要人為的調(diào)節(jié)學(xué)習(xí)率,它可以自動(dòng)調(diào)節(jié);缺點(diǎn)在于,隨著迭代次數(shù)增多,學(xué)習(xí)率會(huì)越來越小,最終會(huì)趨近于0。

3 動(dòng)量優(yōu)化法

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

常用的參數(shù) learning_rate,momentum,use_nesterov使用Momentum算法的Optimizer使用動(dòng)量(Momentum)的隨機(jī)梯度下降法(SGD),主要思想是引入一個(gè)積攢歷史梯度信息動(dòng)量來加速SGD。

動(dòng)量優(yōu)化法的優(yōu)點(diǎn)是收斂快,不容易陷入局部最優(yōu)解,但是缺點(diǎn)是有時(shí)候會(huì)沖過頭了,使得結(jié)果不夠精確。

如果使得use_nesterov=True,則該優(yōu)化器實(shí)現(xiàn)牛頓加速梯度(NAG, Nesterov accelerated gradient)算法,該算法是Momentum動(dòng)量算法的變種。

4 RMSProp算法

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

常用的參數(shù)由learning_rate

RMSProp算法修改了AdaGrad的梯度積累為指數(shù)加權(quán)的移動(dòng)平均,使得其在非凸設(shè)定下效果更好。

RMSProp算法在經(jīng)驗(yàn)上已經(jīng)被證明是一種有效且實(shí)用的深度神經(jīng)網(wǎng)絡(luò)優(yōu)化算法。目前它是深度學(xué)習(xí)從業(yè)者經(jīng)常采用的優(yōu)化方法之一。

5 Adam算法

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

常用的參數(shù)由learning_rate

Adam中動(dòng)量直接并入了梯度一階矩(指數(shù)加權(quán))的估計(jì)。相比于缺少修正因子導(dǎo)致二階矩估計(jì)可能在訓(xùn)練初期具有很高偏置的RMSProp,Adam包括偏置修正,修正從原點(diǎn)初始化的一階矩(動(dòng)量項(xiàng))和(非中心的)二階矩估計(jì)。

Adam通常被認(rèn)為對超參數(shù)的選擇相當(dāng)魯棒,盡管學(xué)習(xí)率有時(shí)需要從建議的默認(rèn)修改。
在實(shí)際運(yùn)用中Adam效果非常優(yōu)秀。

例子

本文以Mnist手寫體識別為例子,將各個(gè)Optimizer在實(shí)際分類中進(jìn)行運(yùn)用,本例中,使用的神經(jīng)網(wǎng)絡(luò)是一個(gè)二層神經(jīng)網(wǎng)絡(luò),每一層神經(jīng)元均為150個(gè),所用激勵(lì)函數(shù)均為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數(shù)據(jù)類型,求平均。
    result = sess.run(accuracy,feed_dict = {xs:batch_xs,ys:batch_ys})   #執(zhí)行
    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是標(biāo)簽,logits是預(yù)測值,交叉熵。
    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("訓(xùn)練%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)

在該部分中,我主要只修改訓(xùn)練的Optimizer。

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

1 梯度下降法

在該例子中,訓(xùn)練器為:

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

得到結(jié)果:

訓(xùn)練1次的識別率為:0.119100。
訓(xùn)練1001次的識別率為:0.864600。
訓(xùn)練2001次的識別率為:0.889300。
訓(xùn)練3001次的識別率為:0.897400。
訓(xùn)練4001次的識別率為:0.905600。
訓(xùn)練5001次的識別率為:0.910200。

2 Adagrad下降法

在該例子中,訓(xùn)練器為:

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

得到結(jié)果

訓(xùn)練1次的識別率為:0.136100。
訓(xùn)練1001次的識別率為:0.871600。
訓(xùn)練2001次的識別率為:0.894400。
訓(xùn)練3001次的識別率為:0.900500。
訓(xùn)練4001次的識別率為:0.909100。
訓(xùn)練5001次的識別率為:0.911600。

3 動(dòng)量優(yōu)化法

在該例子中,訓(xùn)練器為:

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

得到結(jié)果

訓(xùn)練1次的識別率為:0.121300。
訓(xùn)練1001次的識別率為:0.894800。
訓(xùn)練2001次的識別率為:0.909400。
訓(xùn)練3001次的識別率為:0.916900。
訓(xùn)練4001次的識別率為:0.920700。
訓(xùn)練5001次的識別率為:0.927600。

4 RMSProp算法

在該例子中,訓(xùn)練器為:;

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

得到結(jié)果

訓(xùn)練1次的識別率為:0.071500。
訓(xùn)練1001次的識別率為:0.929500。
訓(xùn)練2001次的識別率為:0.944000。
訓(xùn)練3001次的識別率為:0.954100。
訓(xùn)練4001次的識別率為:0.953900。
訓(xùn)練5001次的識別率為:0.958000。

5 Adam算法

在該例子中,訓(xùn)練器為:

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

得到結(jié)果

訓(xùn)練1次的識別率為:0.103100。
訓(xùn)練1001次的識別率為:0.900700。
訓(xùn)練2001次的識別率為:0.928100。
訓(xùn)練3001次的識別率為:0.938900。
訓(xùn)練4001次的識別率為:0.945600。
訓(xùn)練5001次的識別率為:0.952100。

總結(jié)

在本例中,RMSProp算法和Adam算法在短時(shí)間內(nèi)就得到了很好的訓(xùn)練效果,識別率都在95%以上,相比之下梯度下降法、Adagrad下降法和動(dòng)量優(yōu)化法表現(xiàn)較為遜色,但不能說明在任何情況下都是RMSProp算法和Adam算法比其它算法更加優(yōu)秀,在實(shí)際應(yīng)用中,選擇哪種優(yōu)化器應(yīng)結(jié)合具體問題具體分析。

同時(shí),也優(yōu)化器的選擇也取決于使用者對優(yōu)化器的掌握情況,其中調(diào)節(jié)參數(shù)就是非常重要的一環(huán),更多關(guān)于tensorflow優(yōu)化器Optimizer的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • wxPython色環(huán)電阻計(jì)算器

    wxPython色環(huán)電阻計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了wxPython色環(huán)電阻計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 對比Python中__getattr__和 __getattribute__獲取屬性的用法

    對比Python中__getattr__和 __getattribute__獲取屬性的用法

    這篇文章主要介紹了對比Python中__getattr__和 __getattribute__獲取屬性的用法,注意二者間的區(qū)別,__getattr__只作用于不存在的屬性,需要的朋友可以參考下
    2016-06-06
  • 解決Python 異常TypeError: cannot concatenate ''str'' and ''int'' objects

    解決Python 異常TypeError: cannot concatenate ''str'' and ''int''

    這篇文章主要介紹了解決Python 異常TypeError: cannot concatenate 'str' and 'int' objects,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python opencv之SURF算法示例

    python opencv之SURF算法示例

    這篇文章主要介紹了python opencv之SURF算法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • 淺析Python中的for 循環(huán)

    淺析Python中的for 循環(huán)

    這篇文章主要介紹了淺析Python中的for 循環(huán)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 在Python中使用代理IP的方法詳解

    在Python中使用代理IP的方法詳解

    在網(wǎng)絡(luò)爬蟲開發(fā)中,使用代理IP是非常常見的技巧,Python作為一門強(qiáng)大的編程語言,也提供了很多方法來使用代理IP,下面,我將就如何在Python中使用代理IP進(jìn)行詳細(xì)的闡述,并舉例說明,需要的朋友可以參考下
    2023-07-07
  • 對numpy中的transpose和swapaxes函數(shù)詳解

    對numpy中的transpose和swapaxes函數(shù)詳解

    今天小編就為大家分享一篇對numpy中的transpose和swapaxes函數(shù)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • jupyter默認(rèn)工作目錄的更改方法

    jupyter默認(rèn)工作目錄的更改方法

    jupyter notebook是一個(gè)以網(wǎng)頁形式來使用的python編輯器,很多小伙伴在第一次安裝它的時(shí)候選擇的都是默認(rèn)安裝,那么jupyter默認(rèn)工作目錄如何更改,本文就來介紹一下
    2023-08-08
  • Python多線程應(yīng)用于自動(dòng)化測試操作示例

    Python多線程應(yīng)用于自動(dòng)化測試操作示例

    這篇文章主要介紹了Python多線程應(yīng)用于自動(dòng)化測試操作,結(jié)合實(shí)例形式分析了Python多線程基于Selenium進(jìn)行自動(dòng)化操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-12-12
  • Python持續(xù)監(jiān)聽文件變化代碼實(shí)例

    Python持續(xù)監(jiān)聽文件變化代碼實(shí)例

    這篇文章主要介紹了Python持續(xù)監(jiān)聽文件變化代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評論