2017-06-30 4 views
4

私はtf.Variable()を作成して、その変数を使用して単純な関数を作成してから、元の変数をtf.reshape()で平坦化してから、関数と平坦化された変数の間でtf.gradients 。なぜそれは[None]を返しますか?Tensorflow Reshape tf.reshape()はグラデーションの流れを壊すのはなぜですか?

var = tf.Variable(np.ones((5,5)), dtype = tf.float32) 
f = tf.reduce_sum(tf.reduce_sum(tf.square(var))) 
var_f = tf.reshape(var, [-1]) 
print tf.gradients(f,var_f) 

上記のコードブロックが実行されると[なし]が返されます。これはバグですか?助けてください!

+0

[基本TFチュートリアル](https://www.tensorflow.org/versions/r0.12/get_started/basic_usage#launching_the_graph_in_a_session)に示すように、 'session'で実行する必要があります。 – jkschin

+0

@jkschinこれはこの場合には当てはまりません。コードは計算グラフ内で何も実行していません。計算グラフのみを定義しています。自分で試してみてください - スニペットはセッションの有無にかかわらず同じように動作します。 – kdbanman

答えて

4

あなたはvar_fに対するfの派生物を見つけているが、fではなくvar_fの機能が、varではありません。なぜあなたは[なし]を得ているのですか?今あなたがにコードを変更した場合:

var = tf.Variable(np.ones((5,5)), dtype = tf.float32) 
var_f = tf.reshape(var, [-1]) 
f = tf.reduce_sum(tf.reduce_sum(tf.square(var_f))) 
grad = tf.gradients(f,var_f) 
print(grad) 

あなたの勾配が定義されます。

tf.Tensor 'gradients_28/Square_32_grad/mul_1:0' 形状=(25、)DTYPE =のfloat32>

var = tf.Variable(np.ones((5,5)), dtype = tf.float32, name='var') 
f = tf.reduce_sum(tf.reduce_sum(tf.square(var)), name='f') 
var_f = tf.reshape(var, [-1], name='var_f') 
grad_1 = tf.gradients(f,var_f, name='grad_1') 
grad_2 = tf.gradients(f,var, name='grad_2') 

次のコードのためのグラフの視覚化を以下に示します。

grad_1の派生語は定義されていませんが、 'grad_2`は定義されています。 2つのグラジエントのバックプロパゲーショングラフ(グラディエントグラフ)が示されています。

+0

この回答は簡単で良いですが、私はまだグラデーションが再構成された変数に自動的に表示されないことに驚いています。テンソルの形状は、テンソルの基礎となる配列やその他のデータをラップするオブジェクトに格納されます。 '.reshape'が呼び出されると、基礎となる配列と(いくつかのすべての)他のデータが再利用されるか、または再計算されます。だからこそ改造が速いのです。だから私は、関数のテンソル依存性が、再構成操作によって再利用される(または少なくとも再計算される)データで追跡されることを期待することは合理的だと思います。しかし明らかにそうではありません!私は本当に理由を知りたいです。 – kdbanman

+0

これは興味深い質問です。これは私の理解です:あなたはreshape()で正しいです、データは再利用されます(再計算されません)が、まだ 'var_f'はグラフの別のノードになります。したがって、 'tf.gradients()'を呼び出すと、逆伝播グラフが作成されます。この場合、ノード 'f'はノード' var_f'へのパスを検出しません。 –

+0

これは簡潔な方法です: "* node' f'はノード 'var_f' *"へのパスを見つけません。ありがとうございました。プログラマが再構成インターフェースを消費するので、私はまだ経路が見つからないことに驚いています。私は、テンソルフローの開発者がなぜ変形用の計算グラフに新しいノードを作成することにしたのかを知りたい。そして、その上に、新しい 'var_f'ノードが' f'にエッジを与えられない理由を知りたいと思います。 – kdbanman

関連する問題