2017-01-27 2 views
2

私はtf.gradients()関数で遊んでいましたが、私が期待していない振る舞いに出くわしました。つまり、スライスされた変数の勾配を計算することができないようです。私は一緒に例を入れて、それがうまくいけば、私が何を意味するかを示しています。変数のスライスはグラデーションを返しません。

import tensorflow as tf 

a = tf.Variable([1.0]) 
b = tf.Variable([1.0]) 
c = tf.concat(0, [a, b]) 
print(c) # >Tensor("concat:0", shape=(2,), dtype=float32) 

grad_full = tf.gradients(c, c) 
grad_slice1 = tf.gradients(c, a) 
grad_slice2 = tf.gradients(c, c[:, ]) # --> Here the gradient is None 
grad_slice3 = tf.gradients(c, c[0, ]) # --> Here the gradient is None 

print(grad_full) # >[<tf.Tensor 'gradients/Fill:0' shape=(2,) dtype=float32>] 
print(grad_slice1) # >[<tf.Tensor 'gradients_1/concat_grad/Slice:0' shape=(1,) dtype=float32>] 
print(grad_slice2) # >[None] 
print(grad_slice3) # >[None] 

sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 

grad_full_v, grad_slice_v = sess.run([grad_full[0], grad_slice1[0]]) 
print(grad_full_v) # >[ 1. 1.] 
print(grad_slice_v) # >[ 1.] 

私の質問は以下のとおりです。

1)私は(tf.gradientsを使用しています)それが意図されたように機能しますか?

2)そうした場合、この現象が発生する理由はありますか?私の理解では、スライスは必ずしも逆伝播を破るべきではありません。

3)ネットワーク全体(または少なくとも変数から損失までのすべてのパス)でスライスしないようにする必要がありますか?たとえば、これは、完全に接続されたレイヤーの結果を多数の意味のある部分にスライスしてはならないことを意味します(複数のスカラーを1つのfcレイヤーで見積もり、

私は、Tensorflow 0.11 RC0をPython 3.5のUbuntu 16ソースからビルドしています。

答えて

0

d = c[:, ]は、a, b, cという異なるテンソルを作成します。依存グラフを考えると、dはcに依存します。この場合、グラデーションは機能しません。 grad(y, x)は、xがyに依存する場合には機能しません。

関連する問題