91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用TensorFlow怎么實現權值更新

發布時間:2021-05-20 15:42:21 來源:億速云 閱讀:186 作者:Leah 欄目:開發技術

這篇文章給大家介紹使用TensorFlow怎么實現權值更新,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一. MovingAverage權值滑動平均更新

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是原始網絡(該示例代碼來自DDPG算法,經過滑動更新后的target_net是目標網絡 )

第一句 tf.train.ExponentialMovingAverage,創建一個權值滑動平均的實例;

第二句 apply創建所訓練模型參數的一個復制品(shadow_variable),并對這個復制品增加一個保留權值滑動平均的op,函數average()或average_name()可以用來獲取最終這個復制品(平滑后)的值的。

更新公式為:

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中所有元素創建一個復制,當其是Variable類型時,shadow_variable被初始化為variable的初值,當其是Tensor類型時,初始化為0,無偏。

函數返回一個進行權值平滑的op,因此更新目標網絡時單獨run這個函數就行。

1.3 tf.train.ExponentialMovingAverage.average(var)

用于獲取var的滑動平均結果。

二. tf.train.Optimizer更新網絡權值

2.1 tf.train.Optimizer

tf.train.Optimizer允許網絡通過minimize()損失函數自動進行權值更新,此時tf.train.Optimizer.minimize()做了兩件事:計算梯度,并把梯度自動更新到權值上。

此外,tensorflow也允許用戶自己計算梯度,并做處理后應用給權值進行更新,此時分為以下三個步驟:

1.利用tf.train.Optimizer.compute_gradients計算梯度

2.對梯度進行自定義處理

3.利用tf.train.Optimizer.apply_gradients更新權值

tf.train.Optimizer.compute_gradients(loss, var_list=None, gate_gradients=1, aggregation_method=None, colocate_gradients_with_ops=False, grad_loss=None)

返回一個(梯度,權值)的列表對。

tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None)

返回一個更新權值的op,因此可以用它的返回值ret進行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)

該函數計算ys在xs方向上的梯度,需要注意與train.compute_gradients所不同的地方是,該函數返回一組dydx dydx的列表,而不是梯度-權值對。

其中,gate_gradients是在ys方向上的初始梯度,個人理解可以看做是偏微分鏈式求導中所需要的。

? tf.stop_gradient(input, name=None)

該函數告知整個graph圖中,對input不進行梯度計算,將其偽裝成一個constant常量。比如,可以用在類似于DQN算法中的目標函數:

cost=|r+Q next ?Q current | cost=|r+Qnext?Qcurrent|

可以事先聲明

y=tf.stop_gradient(r+Q next r+Qnext)

關于使用TensorFlow怎么實現權值更新就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤山市| 新和县| 偃师市| 廉江市| 巫山县| 汝州市| 苍溪县| 商都县| 三江| 汉源县| 公安县| 吉隆县| 康保县| 乡城县| 保德县| 平和县| 河南省| 惠安县| 青浦区| 青海省| 阿城市| 临高县| 卢氏县| 竹北市| 永昌县| 商水县| 濮阳县| 巩义市| 尼勒克县| 瑞安市| 天镇县| 扎鲁特旗| 阿克苏市| 汉阴县| 桂东县| 广丰县| 凤城市| 元阳县| 庆城县| 金平| 河间市|