web-dev-qa-db-ja.com

2次元のtf.Variableでtf.scatter_updateを使用する

私はこれに従います テンソルフローで行列要素を操作する 。 tf.scatter_updateを使用します。しかし、私の問題は:tf.Variableが2Dの場合はどうなりますか?まあ言ってみれば:

a = tf.Variable(initial_value=[[0, 0, 0, 0],[0, 0, 0, 0]])

たとえば、各行の最初の要素を更新して、それに値1を割り当てるにはどうすればよいですか?

私は何かを試しました

for line in range(2):
    sess.run(tf.scatter_update(a[line],[0],[1]))

しかし、失敗し(私はそれを予期していました)、エラーを出します:

TypeError: 'ScatterUpdate'の入力 'ref' Op l-value入力が必要です

そのような問題をどのように修正できますか?

`

15
Cfis Yoi

TensorflowではTensorを更新できませんが、変数は更新できます。

scatter_update演算子は、変数の最初の次元のみを更新できます。常に参照テンソルをスキャッター更新に渡す必要があります(a[line]ではなくa)。

これは、変数の最初の要素を更新する方法です。

import tensorflow as tf

g = tf.Graph()
with g.as_default():
    a = tf.Variable(initial_value=[[0, 0, 0, 0],[0, 0, 0, 0]])
    b = tf.scatter_update(a, [0, 1], [[1, 0, 0, 0], [1, 0, 0, 0]])

with tf.Session(graph=g) as sess:
   sess.run(tf.initialize_all_variables())
   print sess.run(a)
   print sess.run(b)

出力:

[[0 0 0 0]
 [0 0 0 0]]
[[1 0 0 0]
 [1 0 0 0]]

しかし、テンソル全体を再度変更する必要がある場合は、完全に新しいものを割り当てるだけの方が速いかもしれません。

12
fabrizioM

私は何かを見つけました ここ 変数名U = [[1、2、3]、[4、5、6]]を作成し、U [:、1] = [ 2、3] U [:、1] .assign(cast_into_tensor [2,3])を実行しました

ここに簡単なコード

x = tf.Variable([[1,2,3],[4,5,6]])
print K.eval(x)
y = [0, 0]
with tf.control_dependencies([x[:,1].assign(y)]):
    x = tf.identity(x)
print K.eval(x)
1
Deepak Sharma