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
risposta
Questo non è implementata in questo momento, ecco GitHub problema seguire i progressi - https://github.com/tensorflow/tensorflow/issues/206
ora essere monitorati in: https://github.com/tensorflow/tensorflow/issues/4639 –
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 :).
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'? –
Sembra che sto cercando gli operatori di confronto: https://www.tensorflow.org/versions/r0.11/api_docs/python/control_flow_ops.html#comparison-operators –
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]
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))
Ora è possibile utilizzare tf.boolean_select https://www.tensorflow.org/api_docs/python/array_ops/slicing_and_joining#boolean_mask –