web-dev-qa-db-ja.com

Tensor内の単一の値を調整する-TensorFlow

これを聞いて恥ずかしい思いをしますが、テンソル内の単一の値をどのように調整しますか?テンソル内の1つの値のみに「1」を追加するとしますか?

インデックスを作成して実行しても機能しません。

TypeError: 'Tensor' object does not support item assignment

1つのアプローチは、0の同一形状のテンソルを構築することです。そして、必要な位置で1を調整します。次に、2つのテンソルを一緒に追加します。繰り返しますが、これは以前と同じ問題に直面します。

APIドキュメントを何度も読みましたが、これを行う方法がわかりません。前もって感謝します!

55
LeavesBreathe

UPDATE:TensorFlow 1.0には tf.scatter_nd() 演算子が含まれています。 _tf.SparseTensor_を作成せずにdeltaを作成します。


これは実際、既存のopsでは驚くほどトリッキーです!おそらく誰かが次のことをまとめるより良い方法を提案できるかもしれませんが、ここでそれを行う1つの方法があります。

tf.constant()テンソルがあるとしましょう:

_c = tf.constant([[0.0, 0.0, 0.0],
                 [0.0, 0.0, 0.0],
                 [0.0, 0.0, 0.0]])
_

...また、ロケーション[1、1]に_1.0_を追加します。これを行う1つの方法は、変更を表す _tf.SparseTensor_deltaを定義することです。

_indices = [[1, 1]]  # A list of coordinates to update.

values = [1.0]  # A list of values corresponding to the respective
                # coordinate in indices.

shape = [3, 3]  # The shape of the corresponding dense tensor, same as `c`.

delta = tf.SparseTensor(indices, values, shape)
_

次に、 tf.sparse_tensor_to_dense() opを使用して、deltaから密なテンソルを作成し、cに追加できます。

_result = c + tf.sparse_tensor_to_dense(delta)

sess = tf.Session()
sess.run(result)
# ==> array([[ 0.,  0.,  0.],
#            [ 0.,  1.,  0.],
#            [ 0.,  0.,  0.]], dtype=float32)
_
66
mrry

tf.scatter_update(ref, indices, updates)またはtf.scatter_add(ref, indices, updates)はどうですか?

ref[indices[...], :] = updates
ref[indices[...], :] += updates

this を参照してください。

8
Liping Liu

tf.scatter_updateには勾配降下演算子が割り当てられておらず、少なくともtf.train.GradientDescentOptimizer。低レベル関数でビット操作を実装する必要があります。

1
johannes