私はこれに従います テンソルフローで行列要素を操作する 。 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入力が必要です
そのような問題をどのように修正できますか?
`
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]]
しかし、テンソル全体を再度変更する必要がある場合は、完全に新しいものを割り当てるだけの方が速いかもしれません。
私は何かを見つけました ここ 変数名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)