2013-05-31 26 views
6

Próbuję uzyskać maksimum wektora z wartością boolowską.Theano: Dlaczego indeksowanie kończy się niepowodzeniem?

Z NumPy:

>>> this = np.arange(10) 
>>> this[~(this>=5)].max() 
4 

Ale z Theano:

>>> that = T.arange(10, dtype='int32') 
>>> that[~(that>=5)].max().eval() 
9 
>>> that[~(that>=5).nonzero()].max().eval() 
Traceback (most recent call last): 
    File "<pyshell#146>", line 1, in <module> 
    that[~(that>=5).nonzero()].max().eval() 
AttributeError: 'TensorVariable' object has no attribute 'nonzero' 

Dlaczego tak się dzieje? Czy to subtelny niuans, którego mi brakuje?

+0

Cóż, dosłowne traceback do drugiego mówi, że tablica nie posiada 'niezerową()' metody/atrybut, więc nie możesz go używać w ten sam sposób, w jaki używasz tablicy numpy. –

+0

@JeffTratner: Który jest przeciwieństwem [przykład] (http://deeplearning.net/software/theano/library/tensor/basic.html#indexing) podanym na stronie internetowej ... –

+1

@NoobSailbot czy używasz prawa wersja? –

Odpowiedz

9

Używasz wersji Theano, która jest zbyt stara. W rzeczywistości tensor_var.nonzero() nie występuje w żadnej wydanej wersji. Musisz zaktualizować wersję rozwojową.

W wersji rozwojowej mam to:

>>> that[~(that>=5).nonzero()].max().eval() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: bad operand type for unary ~: 'tuple' 

To dlatego, że brakuje nawiasu w linii. Oto dobra linia:

>>> that[(~(that>=5)).nonzero()].max().eval() 
array(9, dtype=int32) 

Ale wciąż mamy nieoczekiwany rezultat! Problem polega na tym, że Theano nie wspiera bool. Robiąc ~ na int8, wykonuje bitowe odwrócenie na 8 bitach, a nie na 1 bit. To daje ten wynik:

>>> (that>=5).eval() 
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1], dtype=int8) 
>>> (~(that>=5)).eval() 
array([-1, -1, -1, -1, -1, -2, -2, -2, -2, -2], dtype=int8) 

można usunąć ~ z tym:

>>> that[(that<5).nonzero()].max().eval() 
array(4, dtype=int32) 
+1

Dobre rzeczy, dziękuję. Ale jestem nieco zdezorientowany tym, co masz na myśli przez "wersję rozwojową". Czy to "krwawienie", o którym czytam? Czy to nie ma być eksperymentalne? –

+0

nonzero() jest częścią wydania Theano 0.7 – sim

+0

@ nouiz, chcę tylko powiedzieć, dzięki milionowi za wspaniałą odpowiedź +1. –

Powiązane problemy