Подтвердить что ты не робот

Отрегулируйте одно значение в тензоре - TensorFlow

Я смущенно спрашиваю об этом, но как вы настраиваете одно значение в тензоре? Предположим, вы хотите добавить '1' только к одному значению в своем тензоре?

Выполнение этого путем индексирования не работает:

TypeError: 'Tensor' object does not support item assignment

Один подход заключался бы в построении тензора одинаковой формы 0. А затем настройте 1 в нужном месте. Тогда вы добавите два тензора вместе. Снова это сталкивается с той же проблемой, что и раньше.

Я несколько раз читал документы API и не могу понять, как это сделать. Заранее спасибо!

4b9b3361

Ответ 1

UPDATE: TensorFlow 1.0 включает в себя tf.scatter_nd() оператор, который можно использовать для создания delta ниже без создания tf.SparseTensor.


Это на самом деле удивительно сложно с существующими операциями! Возможно, кто-то может предложить более удобный способ обернуть следующее, но здесь один из способов сделать это.

Скажем, у вас есть тензор tf.constant():

c = tf.constant([[0.0, 0.0, 0.0],
                 [0.0, 0.0, 0.0],
                 [0.0, 0.0, 0.0]])

... и вы хотите добавить 1.0 в местоположение [1, 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)

Ответ 2

Как насчет tf.scatter_update(ref, indices, updates) или tf.scatter_add(ref, indices, updates)?

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

Смотрите это.

Ответ 3

tf.scatter_update не имеет назначенного оператора градиентного спуска и будет tf.train.GradientDescentOptimizer ошибку при обучении по крайней мере с tf.train.GradientDescentOptimizer. Вы должны реализовать битовые манипуляции с низкоуровневыми функциями.

Ответ 4

Мне кажется, что тот факт, что функции tf.assign, tf.scatter_nd, tf.scatter_update работают только на tf.Variables, недостаточно подчеркнут. Так и есть.

А в более поздних версиях TensorFlow (протестировано с 1.14) вы можете использовать индексирование для tf.Variable для присвоения значений определенным индексам (опять же, это работает только для объектов tf.Variable).

v = tf.Variable(tf.constant([[1,1],[2,3]]))
change_v = v[0,0].assign(4)
with tf.Session() as sess:
  tf.global_variables_initializer().run()
  print(sess.run(change_v))