2017-10-01 8 views
0

私はここで混乱しています。Tensorflow:tf.gradients()は正確に何を返しますか

のは、我々は簡単なグラフを持っているとしましょう:

a = tf.Variable(tf.truncated_normal(shape=[200, 1], mean=0., stddev=.5)) 
b = tf.Variable(tf.truncated_normal(shape=[200, 100], mean=0., stddev=.5)) 
add = a+b 

add 
<tf.Tensor 'add:0' shape=(200, 100) dtype=float32> #shape is because of broadcasting 

は、だから私は2つのテンソルを取り込み、出力として1テンソルを生成したノードを持っています。それでは、だから我々は正確に入力テンソルの形で勾配を得ること

tf.gradients(add, [a, b]) 
[<tf.Tensor 'gradients/add_grad/Reshape:0' shape=(200, 1) dtype=float32>, 
<tf.Tensor 'gradients/add_grad/Reshape_1:0' shape=(200, 100) dtype=float32>] 

にtf.gradientsを実行してみましょう。しかし、なぜ? 部分偏微分を取ることができる単一のメトリックはありません。グラジエントは、入力テンソルのすべての単一値から出力テンソルのすべての単一値にマッピングするべきではありません。実際に入力に対して200x1x200x100グラジエントを与えますか?

これは、出力テンソルのすべての要素がテンソルbの1つの値とテンソルaの1つの値にのみ依存する単純な例です。しかし、もし我々がテンソル上でガウスぼかしを実行するような、より複雑な何かを行うならば、グラジエントは確かに入力テンソルよりも大きくなければならないでしょう。

私はここで間違っていますか?

答えて

1

デフォルトでは、tf.gradientsは、出力としてtf.gradientsに渡されたすべてのテンソルのすべての要素を合計することによって得られるスカラーの勾配をとります。

関連する問題