網站首頁 編程語言 正文
前言
優化器的選擇關乎參數更新的方法,合理的方法可以幫助機器學習更好的尋找到全局最佳值。
那我們快點開始學習吧
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算法比其它算法更加優秀,在實際應用中,選擇哪種優化器應結合具體問題具體分析。
原文鏈接:https://blog.csdn.net/weixin_44791964/article/details/96428665
相關推薦
- 2023-02-09 利用C++開發一個protobuf動態解析工具_C 語言
- 2023-04-02 使用Pytorch如何完成多分類問題_python
- 2024-01-27 什么是消息隊列
- 2022-03-31 Go中變量命名規則與實例_Golang
- 2022-07-06 python?pandas遍歷每行并累加進行條件過濾方式_python
- 2022-08-27 asp.net中MVC的處理流程詳解_基礎應用
- 2022-03-23 C++通過文件指針獲取文件大小的方法實現_C 語言
- 2023-10-15 DPC_WATCHDOG_VIOLATION藍屏分析
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支