2016-07-19 2 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 is kind'a загадочный. И я попробовал разные значения arg, скажем

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

и не удалось.

Btw, в моем случае, M довольно большой и динамически изменяется. Таким образом, добавление нулевой единицы, равной 1 элементарной матрице, в M не соответствует действительности.

ответ

3

tf.scatter_add обновляет срезы тензора и не способен обновлять отдельные коэффициенты. Например, он может сразу обновлять целые строки матрицы.

Кроме того, форма аргумента updates для tf.scatter_add зависит от формы аргумента indices. Когда ref аргумент представляет собой матрицу с формой (M, N), то

  • Если indices является скаляром i, то updates должен быть вектором с формой (N).
  • Если indices - это вектор [i1, i2, .. ik] с формой (k), то updates должен иметь форму (k, N).

В вашем случае, вы можете просто добавить [1, 0] к первой строке M следующим образом, чтобы получить эффект, который вы хотите:

sess.run(tf.scatter_add(M, 0, [1, 0])) 
array([[2, 2], 
    [3, 4]], dtype=int32) 
Смежные вопросы