2016-01-04 34 views
12

Capisco che restituisca le posizioni dei valori True, in modo da poter utilizzare il risultato shape[0] per ottenere il numero di True s.Contare il numero di valori "Veri" nel tensore booleano

Tuttavia, quando provo a utilizzarlo, la dimensione è sconosciuta (il che ha senso in quanto deve essere calcolato in fase di esecuzione). Quindi la mia domanda è: come posso accedere a una dimensione e usarla in un'operazione come una somma?

Ad esempio:

myOtherTensor = tf.constant([[True, True], [False, True]]) 
myTensor = tf.where(myOtherTensor) 
myTensor.get_shape() #=> [None, 2] 
sum = 0 
sum += myTensor.get_shape().as_list()[0] # Well defined at runtime but considered None until then. 
+0

Cosa significa 'myTensor' assomigliare? – erip

+0

@erip I aggiornato con un esempio più esplicito. –

+0

L'output previsto è 2? – erip

risposta

24

È possibile lanciare i valori da galleggianti e calcolare la somma su di loro: tf.reduce_sum(tf.cast(myOtherTensor, tf.float32))

A seconda del caso applicativo concreto si può anche calcolare le somme per riga/colonna se si specificano le dimensioni ridotte della chiamata.

+0

Grazie! Hai dimenticato le equivalenze booleane di Python. –

+0

C'è un modo per farlo senza un cast (e il corrispondente colpo di memoria)? –

4

risposta di Rafal è quasi certamente il modo più semplice per contare il numero di true elementi del tensore, ma l'altra parte della tua domanda ha chiesto:

[H] ome posso accedere a una dimensione e usarlo in un'operazione come una somma?

Per fare ciò, è possibile utilizzare shape-related operations di TensorFlow, che agiscono sul valore di runtime del tensore. Ad esempio, tf.size(t) produce uno scalare Tensor contenente il numero di elementi in t e tf.shape(t) produce un 1D Tensor contenente le dimensioni di t in ciascuna dimensione.

L'utilizzo di questi operatori, il programma potrebbe anche essere scritta come:

myOtherTensor = tf.constant([[True, True], [False, True]]) 
myTensor = tf.where(myOtherTensor) 
countTrue = tf.shape(myTensor)[0] # Size of `myTensor` in the 0th dimension. 

sess = tf.Session() 
sum = sess.run(countTrue) 
+0

grazie mille per questo! sarebbe possibile passare da 0 alla valle risultante? Sarebbe un tensore a elemento singolo, non sarebbe? Quindi non potevo passarlo a xrange() (a meno che xrange non fosse stato esteso per accettare i Tensors)? Se questo non è chiaro, farò una nuova domanda a riguardo con maggiori dettagli. –

+0

Hmm, non sono abbastanza sicuro di cosa stai chiedendo. Vuoi scorrere le dimensioni di 'myTensor' e utilizzare la dimensione in ogni dimensione? Forse questo sarebbe meglio affrontato in una nuova domanda. – mrry

+0

sì, era mal formulato. Ne scriverò uno –

0

C'è una funzione tensorflow per contare valori diversi da zero tf.count_nonzero. La funzione accetta anche argomenti axis e keep_dims.

Ecco un semplice esempio:

import numpy as np 
import tensorflow as tf 
a = tf.constant(np.random.random(100)) 
with tf.Session() as sess: 
    print(sess.run(tf.count_nonzero(tf.greater(a, 0.5)))) 
2

Credo che questo sia il modo più semplice per farlo:

In [38]: myOtherTensor = tf.constant([[True, True], [False, True]]) 

In [39]: if_true = tf.count_nonzero(myOtherTensor) 

In [40]: sess.run(if_true) 
Out[40]: 3 
Problemi correlati