1. 程式人生 > 程式設計 >Tensorflow的梯度非同步更新示例

Tensorflow的梯度非同步更新示例

背景:

先說一下應用吧,一般我們進行網路訓練時,都有一個batchsize設定,也就是一個batch一個batch的更新梯度,能有這個batch的前提是這個batch中所有的圖片的大小一致,這樣才能組成一個placeholder。那麼若一個網路對圖片的輸入沒有要求,任意尺寸的都可以,但是我們又想一個batch一個batch的更新梯度怎麼辦呢?

操作如下:

先計算梯度:

# 模型部分
Optimizer = tf.train.GradientDescentOptimizer(1)
gradient = Optimizer.compute_gradients(loss)  # 每次計算所有變數的梯度
grads_holder = [(tf.placeholder(tf.float32,shape=g.get_shape()),v) for (g,v) in gradient]# 將每次計算的梯度儲存
optm = Optimizer.apply_gradients(grads_holder) # 進行梯度更新

# 初始化部分
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# 實際訓練部分
grads = []         # 定義一個空的列表用於儲存每次計算的梯度
for i in range(batchsize): # batchsize設定在這裡
  x_i = ...       # 輸入
  y_real = ...      # 標籤
  grad_i = sess.run(gradient,feed_dict={inputs: x_i,outputs: y_real}) #梯度計算
  grads.append(grad_i)  # 梯度儲存
# 定義一個空的字典用於儲存,batchsize中所有梯度的和
grads_sum = {}     
# 將網路中每個需要更新梯度的變數都遍歷一遍  
for i in range(len(grads_holder)): 
  k = grads_holder[i][0] # 得到該變數名
  # 將該變數名下的所有梯度求和,這裡也可以求平均,求平均只需要除以batchsize
  grads_sum[k] = sum([g[i][0] for g in grads]) 
# 完成梯度更新
sess.run(optm,feed_dict=grads_sum) 

以上這篇Tensorflow的梯度非同步更新示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。