2015-11-17 58 views
12

In numpy, con due array della stessa forma, x e , è possibile eseguire sezioni come questa y[x > 1]. Come si ottiene lo stesso risultato in tensorflow? y[tf.greater(x, 1)] non funziona e tf.slice non supporta nulla di simile. C'è un modo per indicizzare con un tensore booleano in questo momento o è attualmente non supportato?Indicizzazione tensorflow con tensore booleano

+2

Ora è possibile utilizzare tf.boolean_select https://www.tensorflow.org/api_docs/python/array_ops/slicing_and_joining#boolean_mask –

risposta

5

Non direi che non è completamente implementata. Com'è per un doppio negativo?

Tensorflow supporta in realtà un numero elevato di sezioni e tagli, anche se la sintassi potrebbe essere leggermente meno carina. Ad esempio, se si desidera creare un nuovo array uguale a y quando x>1 ma uguale a 0 altrimenti, si può assolutamente farlo. Controlla comparison operators ad es.

masked = tf.greater(x,1) 
zeros = tf.zeros_like(x) 
new_tensor = tf.where(masked, y, zeros) 

Se, d'altra parte, si vuole fare un nuovo array che contiene solo i ragazzi dove x>1 si possono fare che combinando where con la funzione gather. Dettagli per gather possono essere trovati a

https://www.tensorflow.org/versions/master/api_docs/python/array_ops/slicing_and_joining

PS. Ovviamente, x>1 non è differenziabile rispetto a x ... tf può essere ottimo, ma non funziona magicamente :).

+0

Ma sia 'select' che' where' prendono come input una maschera booleana. Come si prende il tensore 'x' come input e si produce una maschera booleana che è' True' dove 'x> 1'? –

+0

Sembra che sto cercando gli operatori di confronto: https://www.tensorflow.org/versions/r0.11/api_docs/python/control_flow_ops.html#comparison-operators –

12

Prova:

ones = tf.ones_like(x) # create a tensor all ones 
mask = tf.greater(x, ones) # boolean tensor, mask[i] = True iff x[i] > 1 
slice_y_greater_than_one = tf.boolean_mask(y, mask) 

Vedi tf.boolean_mask

EDIT: un altro modo (migliore?) Per farlo:

import tensorflow as tf 

x = tf.constant([1, 2, 0, 4]) 
y = tf.Variable([1, 2, 0, 4]) 
mask = x > 1 
slice_y_greater_than_one = tf.boolean_mask(y, mask) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print (sess.run(slice_y_greater_than_one)) # [2 4] 
0

tf.boolean_mask fa il lavoro, ma su alcune piattaforme come Raspberry Pi o OSX, l'operazione non è supportata nelle distribuzioni di ruote Tensorflow (controllare questo tf.boolean_mask not supported on OSX. Quindi un'alternativa è usare where e gather come suggerito da @Jackson Loper. Per esempio:

x = tf.Variable([1, 2, 0, 4]) 
ix = tf.where(x > 1) 
y = tf.gather(x, ix) 

with tf.Session() as sess: 
sess.run(tf.global_variables_initializer()) 
print(sess.run(y)) 
Problemi correlati