2016-01-04 4 views
12

Rozumiem, że tf.where powróci lokalizacje True wartości, tak że mogę użyć wynik jest na shape[0] aby uzyskać liczbę True s.liczba Hrabia „true” w wartości logicznej Tensor

Jednak kiedy próbuję tego użyć, wymiar jest nieznany (co ma sens, ponieważ musi zostać obliczony w czasie wykonywania). Moje pytanie brzmi: jak mogę uzyskać dostęp do wymiaru i użyć go w operacji podobnej do sumy?

Na przykład:

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

Co 'myTensor' wyglądać? – erip

+0

@erip Zaktualizowałem z bardziej wyraźnym przykładem. –

+0

Czy oczekiwany wynik 2? – erip

Odpowiedz

24

Można rzucać wartości do pływaków i obliczyć sumę na nich: tf.reduce_sum(tf.cast(myOtherTensor, tf.float32))

zależności od rzeczywistego przypadku użycia można również obliczyć sumy za wiersz/kolumna jeżeli określasz wymiary zmniejszenia połączenia.

+0

Dziękujemy! Zapomniałem o równoważności Boole'a Pythona. –

+0

Czy istnieje sposób, aby to zrobić bez rzutowania (i odpowiedniego trafienia pamięci)? –

4

odpowiedź Rafała jest prawie na pewno najprostszy sposób policzyć true elementów w tensora, ale z drugiej części pytania zadawane:

[H] ow mam dostępu do wymiaru i używać go w operacji takiej jak suma?

Aby to zrobić, można użyć TensorFlow na shape-related operations, które działają na wartości wykonawczego tensora. Na przykład: tf.size(t) tworzy skalarną Tensor zawierającą liczbę elementów w t, a tf.shape(t) tworzy 1D Tensor o rozmiarze t w każdym wymiarze.

Używanie tych operatorów, program może również być zapisany jako:

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

wielkie dzięki za to! czy byłoby możliwe przejście przez 0 do wynikowej vale? Byłby to tensor jednoelementowy, czyż nie? Więc nie mogłem przekazać tego do xrange() (chyba że xrange został przedłużony, aby zaakceptować Tensory)? Jeśli to nie jest jasne, zadam nowe pytanie o to bardziej szczegółowo. –

+0

Hmm, nie jestem do końca pewien, o co pytasz. Czy chcesz przechodzić przez wymiary 'myTensor' i używać rozmiaru w każdym wymiarze? Być może najlepiej byłoby to rozwiązać w nowym pytaniu. – mrry

+0

tak, to było źle sformułowane. Napiszę jeden. –

0

Istnieje funkcja tensorflow policzyć wartości niezerowe tf.count_nonzero. Funkcja przyjmuje również argumenty: axis i keep_dims.

Oto prosty przykład:

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

myślę, że to jest najprostszym sposobem, aby to zrobić:

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