2017-07-17 5 views
0

tf.gradientsは、最初の引数としてテンソルのリストを渡したとき、どのくらい正確に動作しますか?この非常に小さな例ください:場合は、Tensorflowのドキュメントによると`ys`テンソルのリストを渡すと、tf.gradientsはどのように動作しますか?

grads = tf.gradients(c, [a, b]) 
with tf.Session() as sess: 
    sess.run(grads) # returns (1, 2) 

:私は[a,b]に関して、単一テンソル、cの勾配を計算する場合

a = tf.constant(5) 
b = tf.constant(7) 
c = a + 2 * b 

を、私は期待される答えを得ますリストのテンソルを最初の引数として渡します。ystf.gradientsは、そのリストの勾配を合計し、2番目の引数の各xに対してsum_over_ys(dy/dx)を返します。だから私は期待:

tf.gradients([a, b, c], [a, b]) 

と同じように動作する:

tf.gradients(a + b + c, [a, b]) 

は私が間違っているドキュメントを読んでいますか?このコードをテストすると、2番目の式(明示的に合計をa + b + cとします)の期待結果は[2, 3]ですが、最初は[2, 1]となります。 [2, 1]はどこから来ますか?

+0

奇妙なことに、私が '[tf.identity(a)、tf.identity(b)、c]'に関して微分をとった場合、期待通りにうまく動作します。これはTFのバグですか?何らかの理由で 'ys'のリストに' xs'のいくつかを含めるべきではありませんか? –

答えて

1

これは、理論上入力の影響を受けてはならないtf.constantを使用していることが原因です。

実験を他のもの(たとえばVariables)に置き換えると、期待通りに機能します。

演算子を定数に加えたとき(加算であっても同一であっても)、constantしか表示されないにもかかわらず、constantではない新しいテンソルを取得するため、期待される動作を得ることができます。

関連する問題