2016-01-08 3 views
36

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

Делать это с помощью индексации не работает:

TypeError: 'Tensor' object does not support item assignment 

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

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

ответ

43

ОБНОВЛЕНИЕ: 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() цит сделать густой тензор из 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) 
+0

Спасибо вам огромное. Я согласен с вами в том, что функция, которая может сделать это с большей эффективностью, была бы полезна! – LeavesBreathe

+0

Знаете ли вы, как обрабатываются значения с одним и тем же индексом? – dtracers

+0

nvm это совсем не обрабатывает ... Вы знаете, как это сделать в случае нескольких индексов того же значения? – dtracers

4

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

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

См. this.

+1

он действителен только в том случае, если 'ref' является переменной. –

+0

Это ограничение на самом деле более фундаментально, чем выглядит, если вы видите TF как ограниченный (с точки зрения доступных схем рекурсии), масштабируемое время исполнения в основном-чистого ленивого функционального языка. Затем вы можете видеть, что трудность эффективного обновления (чистого) тензора по существу такая же, как и та, с которой вы сталкиваетесь при обновлении чисто функциональной структуры данных. Без этого уровня чистоты вещи не будут масштабироваться легко. – mnish

 Смежные вопросы

  • Нет связанных вопросов^_^