2016-07-19 10 views
3

tf.scatter_add 1dのためにうまく動作(1を形作る)テンソル:tf.scatter_addを使ってテンソルフローの行列要素をインクリメントする方法は?

> S = tf.Variable(tf.constant([1,2,3,4])) 
> sess.run(tf.initialize_all_variables()) 
> sess.run(tf.scatter_add(S, [0], [10])) 

array([11, 2, 3, 4], dtype=int32) 

> sess.run(tf.scatter_add(S, [0, 1], [10, 100])) 

array([ 21, 102, 3, 4], dtype=int32) 

しかし、どのように、私はインクリメントすることができ、[0,0]

M = tf.Variable(tf.constant([[1,2], [3,4]])) 

の要素が[[2作るために言って、 2]、[3,4]] tf.scatter_addを使用していますか?

official documentationはわかりにくいです。さまざまなarg値を試しました。たとえば、

> sess.run(tf.scatter_add(M, [[0, 0]], [1])) 
*** ValueError: Shapes (1,) and (1, 2, 2) are not compatible 

となりました。

私の場合、Mはかなり大きく、動的にサイズ変更されます。 Mに1要素行列に等しいゼロを追加するのは当てはまりません。

答えて

3

tf.scatter_addは、テンソルのスライスを更新し、個々の係数を更新することはできません。たとえば、行列の行全体を一度に更新することができます。

tf.scatter_addへの引数の形は、indices引数の形によって異なります。 ref引数がその後indicesスカラーiある

  • 場合形状(M, N)有するマトリックスである場合、次いでupdates形状(N)とベクトルであるべきです。
  • indicesが形状(k)のベクトル[i1, i2, .. ik]である場合、updatesは、形状が(k, N)である必要があります。

    sess.run(tf.scatter_add(M, 0, [1, 0])) 
    array([[2, 2], 
        [3, 4]], dtype=int32) 
    
    :あなたが望む効果を得るために、次のようにあなたのケースで

、あなたは単にMの最初の行に[1, 0]を追加することができます

関連する問題