これはTensorflow: How to get gradients per instance in a batch?の可能な複製です。私はとにかくそれに満足している答えがなかったので、私はそれを尋ねます、そして、ここの目標は少し異なります。TensorFlow複数のバッチにわたる平均勾配
私は私が私のGPUに収まることができる非常に大きなネットワークを持っていますが、私は養うことができ、最大バッチサイズはそれよりも大きい32何がGPUがメモリを使い果たしてしまうことになります。グラデーションのより正確な近似を得るために、より大きなバッチを使用したいと思います。
具体的には、サイズが96の大きなバッチの勾配を、3つのバッチを順番に並べて勾配を計算したいとします。私が知っている最良の方法はOptimizer.compute_gradients()
とOptimizer.apply_gradients()
です。ここでは、それは
import tensorflow as tf
import numpy as np
learn_rate = 0.1
W_init = np.array([ [1,2,3], [4,5,6], [7,8,9] ], dtype=np.float32)
x_init = np.array([ [11,12,13], [14,15,16], [17,18,19] ], dtype=np.float32)
X = tf.placeholder(dtype=np.float32, name="x")
W = tf.Variable(W_init, dtype=np.float32, name="w")
y = tf.matmul(X, W, name="y")
loss = tf.reduce_mean(y, name="loss")
opt = tf.train.GradientDescentOptimizer(learn_rate)
grad_vars_op = opt.compute_gradients(loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# Compute the gradients for each batch
grads_vars1 = sess.run(grad_vars_op, feed_dict = {X: x_init[None,0]})
grads_vars2 = sess.run(grad_vars_op, feed_dict = {X: x_init[None,1]})
grads_vars3 = sess.run(grad_vars_op, feed_dict = {X: x_init[None,2]})
# Separate the gradients from the variables
grads1 = [ grad for grad, var in grads_vars1 ]
grads2 = [ grad for grad, var in grads_vars2 ]
grads3 = [ grad for grad, var in grads_vars3 ]
varl = [ var for grad, var in grads_vars1 ]
# Average the gradients
grads = [ (g1 + g2 + g3)/3 for g1, g2, g3 in zip(grads1, grads2, grads3)]
sess.run(opt.apply_gradients(zip(grads,varl)))
print("Weights after 1 gradient")
print(sess.run(W))
を作業することができますどのように小さな例では、往路がGPU上で実行されているので、勾配を平均化し、それらをGPU上で起こる適用CPU上で発生している間今、これはすべての非常に醜いと非効率的です再び。
grads
がnp.array
秒のリストであり、それを動作させるために、1つが、すべてのグラデーションのtf.placeholder
を作成する必要があるためまた、このコードは例外をスローします。
これを行うにはより効率的な方法が必要でしょうか?助言がありますか?
素晴らしい解決策です。 train_stepとtrain_stepの両方のリスト内でzipを行うのは、列挙と索引付けの代わりに(そして恐らくは読みやすくするために)リスト内包表記のほうが少し難しいでしょう。本当にいい解決策です。 – lejlot
すべての操作がGPUで実行されることを修正しましたか? – niko
'assign_op'は、変数が定義されている場所、cpu/gpuに依存します。あなたはgpusでそれらの残りを計算することができます。 –