2016-03-03 33 views
8

Come posso fare quanto segue in tensorflow?Manipolazione di elementi di matrice in tensorflow

mat = [4,2,6,2,3] # 
mat[2] = 0 # simple zero the 3rd element 

non posso usare le parentesi quadre [] perché funziona solo su costanti e non su variabili. Non posso usare la funzione slice perché restituisce un tensore e non puoi assegnarlo a un tensore.

import tensorflow as tf 
sess = tf.Session() 
var1 = tf.Variable(initial_value=[2, 5, -4, 0]) 
assignZerosOP = (var1[2] = 0) # < ------ This is what I want to do 

sess.run(tf.initialize_all_variables()) 

print sess.run(var1) 
sess.run(assignZerosOP) 
print sess.run(var1) 

stamperà

[2, 5, -4, 0] 
[2, 5, 0, 0]) 

risposta

11

Non è possibile modificare un tensore - ma, come avrete notato, è possibile modificare una variabile.

ci sono tre modelli che si potrebbero utilizzare per compiere ciò che si desidera:

(a) Utilizzare tf.scatter_update a colpire direttamente alla parte della variabile che si desidera modificare.

import tensorflow as tf 

a = tf.Variable(initial_value=[2, 5, -4, 0]) 
b = tf.scatter_update(a, [1], [9]) 
init = tf.initialize_all_variables() 

with tf.Session() as s: 
    s.run(init) 
    print s.run(a) 
    print s.run(b) 
    print s.run(a) 

[2 5 -4 0]

[2 9 -4 0]

[2 9 -4 0]

(b) Creare due tf.slice() s del tensore, escluso l'articolo che si desidera modificare, quindi tf.concat(0, [a, 0, b]) insieme.

(c) Creare b = tf.zeros_like(a), e quindi utilizzare tf.select() di scegliere quali elementi da a si desidera, e che azzera da b che si desidera.

Ho incluso (b) e (c) perché funzionano con tensioni normali, non solo variabili.

+0

Grazie mille, è stato sicuramente di aiuto e potrei lavorare con quello, ma sarebbe un po 'combriccoso. Che cosa se in realtà avevo bisogno di cambiare il tensore? Non c'è modo di farlo? Voglio implementare la visualizzazione di rete e ho bisogno di propagare un'immagine fino a un livello di attivazione, azzerare tutte le attivazioni tranne una casuale a e quindi propagarla di nuovo. – Shagas

+0

I tensiori sono immutabili. In generale, se vuoi salvare e cambiare stato, lo memorizzerai in una variabile che * puoi * mutare. Altrimenti, basta creare un nuovo tensore derivato dall'originale e usarlo. Nel caso che stai descrivendo, questo è probabilmente l'approccio. – dga

+0

Grazie per la risposta. Ho risolto il problema utilizzando un nuovo tensore derivato dall'originale come suggerito. – Shagas