2016-01-08 43 views
36

Mi sento imbarazzato a chiedere questo, ma come si regola un singolo valore all'interno di un tensore? Supponiamo di voler aggiungere "1" a un solo valore all'interno del tuo tensore?Regolare il valore singolo all'interno del tensore - TensorFlow

Farlo per l'indicizzazione non funziona:

TypeError: 'Tensor' object does not support item assignment 

Un approccio potrebbe essere quello di costruire un tensore forma identica di 0. E poi regolando un 1 nella posizione desiderata. Quindi aggiungerei i due tensore insieme. Anche in questo caso si verifica lo stesso problema di prima.

Ho letto i documenti dell'API più volte e non riesco a capire come farlo. Grazie in anticipo!

risposta

43

UPDATE: tensorflow 1.0 include un operatore tf.scatter_nd(), che può essere usato per creare delta sotto senza creare un tf.SparseTensor.


Questo è in realtà sorprendentemente difficile con le operazioni esistenti! Forse qualcuno può suggerire un modo migliore per concludere il seguente, ma ecco un modo per farlo.

Diciamo che si dispone di un tensore tf.constant():

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

... e si desidera aggiungere 1.0 nella posizione [1, 1]. Un modo si potrebbe fare questo è quello di definire un tf.SparseTensor, delta, che rappresenta la variazione:

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) 

quindi è possibile utilizzare il tf.sparse_tensor_to_dense() op per fare un tensore denso da delta e aggiungerlo al 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

Grazie immensamente. Sono d'accordo con te che una funzione che può farlo internamente con più efficienza sarebbe utile! – LeavesBreathe

+0

sai come gestisce i valori con lo stesso indice? – dtracers

+0

nvm non gestisce bene tutto ... Sai come fare nel caso di più indici dello stesso valore? – dtracers

4

Che ne dici di tf.scatter_update(ref, indices, updates) o tf.scatter_add(ref, indices, updates)?

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

Vedere this.

+1

è valido solo se il 'ref' è una variabile. –

+0

Questa limitazione è in realtà più fondamentale di quanto sembri, se si considera TF come una limitazione (in termini di schemi di ricorsione disponibili), tempo di esecuzione scalabile di un linguaggio funzionale pigro per lo più puro. Quindi si può vedere che la difficoltà di aggiornare in modo efficiente un tensore (puro) è essenzialmente la stessa di quella che si incontra nell'aggiornamento di una struttura di dati puramente funzionale. Senza quel livello di purezza le cose non sarebbero scalabili facilmente. – mnish

Problemi correlati