私は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ソースからビルドしています。