2016-01-08 37 views
36

Czuję się zakłopotany, prosząc o to, ale jak dostosować pojedynczą wartość w tensorze? Załóżmy, że chcesz dodać "1" tylko do jednej wartości w tensorze?Dostosuj pojedynczą wartość w tensorze - TensorFlow

Robi to poprzez indeksowanie nie działa:

TypeError: 'Tensor' object does not support item assignment 

Jednym rozwiązaniem byłoby zbudowanie identycznie ukształtowane tensor 0 jest. A następnie dostosowując 1 w żądanej pozycji. Wtedy dodalibyście razem dwa tensory. Znowu to prowadzi do tego samego problemu, co wcześniej.

Przeczytałem kilka razy dokumenty API i nie wiem, jak to zrobić. Z góry dziękuję!

Odpowiedz

43

UPDATE: TensorFlow 1.0 zawiera operator tf.scatter_nd(), który może być używany do tworzenia delta poniżej bez tworzenia tf.SparseTensor.


To jest rzeczywiście zaskakująco podchwytliwe z istniejącymi ops! Być może ktoś może zaproponować lepszy sposób na zawarcie poniższych, ale oto jeden sposób, aby to zrobić.

Powiedzmy masz tf.constant() tensor:

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

... i chcesz dodać 1.0 na miejscu [1, 1]. Jednym ze sposobów można to zrobić jest zdefiniowanie tf.SparseTensor, delta, reprezentujący zmiany:

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) 

Następnie można użyć tf.sparse_tensor_to_dense() op, aby gęstą tensor z delta i dodać go do 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

Dziękuję bardzo. Zgadzam się z tobą, że przydatna byłaby funkcja, która może to zrobić wewnętrznie z większą wydajnością! – LeavesBreathe

+0

Czy wiesz, w jaki sposób obsługuje wartości z tym samym indeksem? – dtracers

+0

nvm nie radzi sobie tak dobrze w ogóle ... Czy wiesz, jak to zrobić w przypadku wielu indeksów o tej samej wartości? – dtracers

4

Co powiecie na tf.scatter_update(ref, indices, updates) lub tf.scatter_add(ref, indices, updates)?

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

Zobacz this.

+1

jest ważne tylko wtedy, gdy 'ref' jest zmienną. –

+0

To ograniczenie jest w rzeczywistości bardziej fundamentalne, niż się wydaje, jeśli widzisz TF jako ograniczoną (pod względem dostępnych schematów rekursji), skalowalny czas działania leniwego języka funkcjonalnego, który jest najczęściej czysty. Następnie można zauważyć, że trudność w skutecznej aktualizacji (czystego) tensora jest zasadniczo taka sama, jak w przypadku aktualizacji czysto funkcjonalnej struktury danych. Bez tego poziomu czystości rzeczy nie skalowaliby się łatwo. – mnish