2013-05-31 19 views
6

Ich versuche, das Maximum eines Vektors mit einem booleschen Wert zu erhalten.Theano: Warum schlägt die Indexierung in diesem Fall fehl?

Mit Numpy:

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

Aber mit 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' 

Warum passiert das das? Ist das eine subtile Nuance, die ich vermisse?

+0

Nun, die wörtlichen Zurückverfolgungs für Ihren zweiter sagen, dass das Array keine 'ungleich Null hat()' Methode/Attribut, so dass Sie das nicht auf die gleiche Weise verwenden können, wie Sie ein numpy Array verwenden würden. –

+0

@JeffTratner: Was ist gegen das [Beispiel] (http://deeplearning.net/software/theano/library/tensor/basic.html#indexing) auf der Website zur Verfügung gestellt ... –

+1

@NoobSailbot verwenden Sie das Recht Ausführung? –

Antwort

9

Sie verwenden eine Version von Theano, die zu alt ist. Tatsächlich ist tensor_var.nonzero() in keiner freigegebenen Version. Sie müssen auf die Entwicklungsversion aktualisieren.

Mit der Entwicklung Version Ich habe dies:

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

Dies liegt daran, dass Sie Klammern in Ihrer Linie fehlen. Hier ist die gute Linie:

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

Aber wir haben immer noch unerwartetes Ergebnis! Das Problem ist, dass Theano Bool nicht unterstützt. Doing ~ auf int8 macht das bitweise Invertieren von 8 Bits, nicht 1 Bit. Es macht dieses Ergebnis:

>>> (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) 

Sie können die ~ mit diesem entfernen:

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

Gute Sachen, danke. Aber ich bin ein wenig verwirrt darüber, was Sie mit "Entwicklungsversion" meinen. Ist das das "blutigste" was ich gelesen habe? Soll das nicht experimentell sein? –

+0

nonzero() ist ein Teil von Theano 0.7 Release – sim

+0

@nouiz, ich möchte nur sagen, danke eine Million für Ihre wunderbare Antwort +1. –

Verwandte Themen