TensorFlow的權(quán)值更新方法
一. MovingAverage權(quán)值滑動平均更新
1.1 示例代碼:
def create_target_q_network(self,state_dim,action_dim,net): state_input = tf.placeholder("float",[None,state_dim]) action_input = tf.placeholder("float",[None,action_dim]) ema = tf.train.ExponentialMovingAverage(decay=1-TAU) target_update = ema.apply(net) target_net = [ema.average(x) for x in net] layer1 = tf.nn.relu(tf.matmul(state_input,target_net[0]) + target_net[1]) layer2 = tf.nn.relu(tf.matmul(layer1,target_net[2]) + tf.matmul(action_input,target_net[3]) + target_net[4]) q_value_output = tf.identity(tf.matmul(layer2,target_net[5]) + target_net[6]) return state_input,action_input,q_value_output,target_update def update_target(self): self.sess.run(self.target_update)
其中,TAU=0.001,net是原始網(wǎng)絡(luò)(該示例代碼來自DDPG算法,經(jīng)過滑動更新后的target_net是目標(biāo)網(wǎng)絡(luò) )
第一句 tf.train.ExponentialMovingAverage,創(chuàng)建一個權(quán)值滑動平均的實(shí)例;
第二句 apply創(chuàng)建所訓(xùn)練模型參數(shù)的一個復(fù)制品(shadow_variable),并對這個復(fù)制品增加一個保留權(quán)值滑動平均的op,函數(shù)average()或average_name()可以用來獲取最終這個復(fù)制品(平滑后)的值的。
更新公式為:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
在上述代碼段中,target_net是shadow_variable,net是variable
1.2 tf.train.ExponentialMovingAverage.apply(var_list=None)
var_list必須是Variable或Tensor形式的列表。這個方法對var_list中所有元素創(chuàng)建一個復(fù)制,當(dāng)其是Variable類型時,shadow_variable被初始化為variable的初值,當(dāng)其是Tensor類型時,初始化為0,無偏。
函數(shù)返回一個進(jìn)行權(quán)值平滑的op,因此更新目標(biāo)網(wǎng)絡(luò)時單獨(dú)run這個函數(shù)就行。
1.3 tf.train.ExponentialMovingAverage.average(var)
用于獲取var的滑動平均結(jié)果。
二. tf.train.Optimizer更新網(wǎng)絡(luò)權(quán)值
2.1 tf.train.Optimizer
tf.train.Optimizer允許網(wǎng)絡(luò)通過minimize()損失函數(shù)自動進(jìn)行權(quán)值更新,此時tf.train.Optimizer.minimize()做了兩件事:計算梯度,并把梯度自動更新到權(quán)值上。
此外,tensorflow也允許用戶自己計算梯度,并做處理后應(yīng)用給權(quán)值進(jìn)行更新,此時分為以下三個步驟:
1.利用tf.train.Optimizer.compute_gradients計算梯度
2.對梯度進(jìn)行自定義處理
3.利用tf.train.Optimizer.apply_gradients更新權(quán)值
tf.train.Optimizer.compute_gradients(loss, var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, grad_loss=None)
返回一個(梯度,權(quán)值)的列表對。
tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None)
返回一個更新權(quán)值的op,因此可以用它的返回值ret進(jìn)行sess.run(ret)
2.2 其它
此外,tensorflow還提供了其它計算梯度的方法:
• tf.gradients(ys, xs, grad_ys=None, name='gradients', colocate_gradients_with_ops=False, gate_gradients=False, aggregation_method=None)
該函數(shù)計算ys在xs方向上的梯度,需要注意與train.compute_gradients所不同的地方是,該函數(shù)返回一組dydx dydx的列表,而不是梯度-權(quán)值對。
其中,gate_gradients是在ys方向上的初始梯度,個人理解可以看做是偏微分鏈?zhǔn)角髮?dǎo)中所需要的。
• tf.stop_gradient(input, name=None)
該函數(shù)告知整個graph圖中,對input不進(jìn)行梯度計算,將其偽裝成一個constant常量。比如,可以用在類似于DQN算法中的目標(biāo)函數(shù):
cost=|r+Q next −Q current | cost=|r+Qnext−Qcurrent|
可以事先聲明
y=tf.stop_gradient(r+Q next r+Qnext)
以上這篇TensorFlow的權(quán)值更新方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python簡單實(shí)現(xiàn)9宮格圖片實(shí)例
在本篇內(nèi)容里小編給各位分享的是一篇關(guān)于python實(shí)現(xiàn)朋友圈中的九宮格圖片的實(shí)例講解,有需要的朋友們可以參考下。2020-09-09PyTorch中torch.nn模塊的實(shí)現(xiàn)
torch.nn是PyTorch中用于構(gòu)建神經(jīng)網(wǎng)絡(luò)的核心模塊,包括多種組件,每個組件都有其特定的原理和使用場景,本文就來詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2024-09-09python?keras構(gòu)建和訓(xùn)練模型簡便性初探
這篇文章主要介紹了python?keras構(gòu)建和訓(xùn)練模型簡便性初探,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02python 實(shí)現(xiàn)視頻流下載保存MP4的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)視頻流下載保存MP4的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01