『TensorFlow』網絡操作API_下


一、優化器基類介紹

標注一點,優化器中的學習率可以是tensor,這意味着它可以feed,

learning_rate: A Tensor or a floating point value.

正常使用流程:

創建優化器對象 -> 指定最小化loss & 可優化參數 -> runminimize實際包含兩個操作:首先計算梯度,然后更新可訓練參數。

 非標准化操作:

希望計算出梯度之后 - > 人工處理梯度 -> 優化參數,

使用兩個新的函數取代minimize:

 1 # 創建一個optimizer.
 2 opt = GradientDescentOptimizer(learning_rate=0.1)
 3 
 4 # 計算<list of variables>相關的梯度
 5 grads_and_vars = opt.compute_gradients(loss, <list of variables>)
 6 
 7 # grads_and_vars為tuples (gradient, variable)組成的列表。
 8 #對梯度進行想要的處理,比如cap處理
 9 capped_grads_and_vars = [(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]
10 
11 # 令optimizer運用capped的梯度(gradients)
12 opt.apply_gradients(capped_grads_and_vars)

二、優化器API詳解

操作  描述
class tf.train.Optimizer 基本的優化類,該類不常常被直接調用,而較多使用其子類,
比如GradientDescentOptimizer, AdagradOptimizer
或者MomentumOptimizer
tf.train.Optimizer.__init__(use_locking, name) 創建一個新的優化器,
該優化器必須被其子類(subclasses)的構造函數調用
tf.train.Optimizer.minimize(loss, global_step=None,
var_list=None, gate_gradients=1,
aggregation_method=None, colocate_gradients_with_ops=False,
name=None, grad_loss=None)
添加操作節點,用於最小化loss,並更新var_list
該函數是簡單的合並了compute_gradients()與apply_gradients()函數
返回為一個優化更新后的var_list,如果global_step非None,該操作還會為global_step做自增操作
tf.train.Optimizer.compute_gradients(loss,var_list=None, gate_gradients=1,
aggregation_method=None,
colocate_gradients_with_ops=False, grad_loss=None)
對var_list中的變量計算loss的梯度
該函數為函數minimize()的第一部分,返回一個以元組(gradient, variable)組成的列表
tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None) 將計算出的梯度應用到變量上,是函數minimize()的第二部分,返回一個應用指定的梯度的操作Operation,對global_step做自增操作
tf.train.Optimizer.get_name() 獲取名稱

初始化優化器:

最小化loss:

 

 計算梯度並返回:

 應用梯度更新參數:

三、並發性參數專欄

minimize()和compute_gradients()的可選參數,

有GATE_NONE,GATE_OP,GATE_GRAPH三個可選選項。

GATE_NONE最高級別並發,會造成結果不可復現;

GATE_OP每一個節點內部不並發,計算完本節點全部梯度才更新;

GATE_GRAPH最低並發,計算好全部梯度才更新參數,如果想在apply梯度(全梯度)前處理一下,使用這個選項。

 

四、調試函數(高級API)

一些optimizer的子類,比如 MomentumOptimizer 和 AdagradOptimizer 分配和管理着額外的用於訓練的變量。這些變量稱之為’Slots’,Slots有相應的名稱,可以向optimizer訪問的slots名稱。有助於在log debug一個訓練算法以及報告slots狀態。

 

 

操作 描述
tf.train.Optimizer.get_slot_names() 返回一個由Optimizer所創建的slots的名稱列表
tf.train.Optimizer.get_slot(var, name) 返回一個name所對應的slot,name是由Optimizer為var所創建
var為用於傳入 minimize() 或 apply_gradients()的變量

 

 

五、優化器子類展示

本節不過多區分這些子類的區別,后續章節會對比各個優化器的性能。

操作  描述
class tf.train.GradientDescentOptimizer 使用梯度下降算法的Optimizer
tf.train.GradientDescentOptimizer.__init__(learning_rate,
use_locking=False, name=’GradientDescent’)
構建一個新的梯度下降優化器(Optimizer)
class tf.train.AdadeltaOptimizer 使用Adadelta算法的Optimizer
tf.train.AdadeltaOptimizer.__init__(learning_rate=0.001,
rho=0.95, epsilon=1e-08,
use_locking=False, name=’Adadelta’)
創建Adadelta優化器
class tf.train.AdagradOptimizer 使用Adagrad算法的Optimizer
tf.train.AdagradOptimizer.__init__(learning_rate,
initial_accumulator_value=0.1,
use_locking=False, name=’Adagrad’)
創建Adagrad優化器
class tf.train.MomentumOptimizer 使用Momentum算法的Optimizer
tf.train.MomentumOptimizer.__init__(learning_rate,
momentum, use_locking=False,
name=’Momentum’, use_nesterov=False)
創建momentum優化器
momentum:動量,一個tensor或者浮點值
class tf.train.AdamOptimizer 使用Adam 算法的Optimizer
tf.train.AdamOptimizer.__init__(learning_rate=0.001,
beta1=0.9, beta2=0.999, epsilon=1e-08,
use_locking=False, name=’Adam’)
創建Adam優化器
class tf.train.FtrlOptimizer 使用FTRL 算法的Optimizer
tf.train.FtrlOptimizer.__init__(learning_rate,
learning_rate_power=-0.5,
initial_accumulator_value=0.1,
l1_regularization_strength=0.0,
l2_regularization_strength=0.0,
use_locking=False, name=’Ftrl’)
創建FTRL算法優化器
class tf.train.RMSPropOptimizer 使用RMSProp算法的Optimizer
tf.train.RMSPropOptimizer.__init__(learning_rate,
decay=0.9, momentum=0.0, epsilon=1e-10,
use_locking=False, name=’RMSProp’)
創建RMSProp算法優化器


免責聲明!

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



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