tensorflow框架學習 (五)—— 損失函數的三種常用優化器


一、tensorflow常用的優化器

 

  關於優化方法請查看:神經網絡DNN —— 優化算法

 

  前面模型訓練的的優化方法一直用的都是普通的梯度下降法,對應的優化器為tf.train.GradientDescentOptimizer,在tensorflow中優化器屬於class tf.train.Optimizer的子類,下面介紹一下另外三種常用的優化器(分別為Momentum、RMSprop、Adam):

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

  • learning_rate:學習率,數據類型為tensor或float。
  • momentum:動量參數,Momentum指數加權的超參數,數據類型為tensor或float。
  • use_locking:若為true,則鎖定更新。
  • name:優化器名字。

 

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

  • learning_rate:學習率,數據類型為tensor或float。
  • decay:Rmsprop平方加權的超參數,歷史梯度的衰減量。
  • momentum:一個標量tensor,我也不知道這個參數干嘛的。
  • epsilon:極小的值,防止分母為0。
  • use_locking:若為true,則鎖定更新。
  • name:優化器名字。

 

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

  • learning_rate:學習率,數據類型為tensor或float。
  • beta1:Momentum指數加權的超參數。
  • beta2:Rmsprop平方加權的超參數。
  • epsilon:極小的值,防止分母為0。
  • use_locking:若為true,則鎖定更新。
  • name:優化器名字。

  這三個類有一個函數minimize(loss),一般搭配使用,例如tf.train.GradientDescentOptimizer(0.1).minimize(loss)提供一個loss參數就可以實現梯度下降的方法。其余的優化器可以在官方文檔的tf.train中查看。

 


 

 

二、代碼示例

import tensorflow as tf
import numpy as np

#創造數據集
x_data=np.linspace(-1,1,10000).reshape(10000,1)
y_data=2*x_data**2+3

#占位符
x_p=tf.placeholder(tf.float32)
y_p=tf.placeholder(tf.float32)

#定義第一個隱藏層Layer1,輸入為x有5個神經元,無激活函數
weights1=tf.Variable(tf.ones([1,5]))
biases1=tf.Variable(tf.zeros([1,5])+0.001)
input1=tf.matmul(x_p,weights1)+biases1

#定義輸出層,輸入為input1,激活函數為tahn
weights2=tf.Variable(tf.random_normal([5,1]))
biases2=tf.Variable(tf.zeros([1,5])+0.001)
prediction=tf.nn.tanh(tf.matmul(input1,weights2)+biases2)

#定義損失函數,loss=均方差+正則化項
loss=tf.reduce_mean(tf.square(y_p-prediction))

#定義優化方式為梯度下降
Gradient=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
Momentum=tf.train.MomentumOptimizer(0.1,0.9).minimize(loss)
RMSprop=tf.train.RMSPropOptimizer(0.1,0.9).minimize(loss)
Adam=tf.train.AdamOptimizer(0.001,0.9,0.999).minimize(loss)

init=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    #普通梯度訓練200次,每隔10次輸出一次loss
    print('\nloss for Gradient:')
    for i in range(200):
        sess.run(Gradient,feed_dict={x_p:x_data,y_p:y_data})
        if i % 9 == 0:
            print(sess.run(loss,feed_dict={x_p:x_data,y_p:y_data}))

    print('\nloss for Momentum:')
    # Momentum梯度訓練200次,每隔10次輸出一次loss
    for i in range(200):
        sess.run(Momentum, feed_dict={x_p: x_data, y_p: y_data})
        if i % 9 == 0:
            print(sess.run(loss, feed_dict={x_p: x_data, y_p: y_data}))

    print('\nloss for RMSprop:')
    # RMSprop梯度訓練200次,每隔10次輸出一次loss
    for i in range(200):
        sess.run(RMSprop, feed_dict={x_p: x_data, y_p: y_data})
        if i % 9 == 0:
            print(sess.run(loss, feed_dict={x_p: x_data, y_p: y_data}))

    print('\nloss for Adam:')
    # Adam梯度訓練200次,每隔10次輸出一次loss
    for i in range(200):
        sess.run(Adam, feed_dict={x_p: x_data, y_p: y_data})
        if i % 9 == 0:
            print(sess.run(loss, feed_dict={x_p: x_data, y_p: y_data}))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM