2013-05-31 1 views
6

나는 부울 값이 주어진 벡터의 최대 값을 얻으려고한다. NumPy와 함께Theano :이 경우 색인 생성이 실패하는 이유는 무엇입니까?

:

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

그러나 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' 

왜 이런 일이 무엇입니까? 이게 미묘한 뉘앙스 야 내가 누락 된거야?

+0

/속성을 사용하므로 numpy 배열을 사용하는 것과 같은 방식으로 사용할 수 없습니다. –

+0

@JeffTratner : 웹 사이트에서 제공되는 [예제] (http://deeplearning.net/software/theano/library/tensor/basic.html#indexing)와 반대되는 것은 ... –

+1

@NoobSailbot은 오른쪽을 사용하고 있습니까? 번역? –

답변

9

너무 오래 된 Theano 버전을 사용 중입니다. 사실, tensor_var.nonzero()는 출시 된 버전에 없습니다. 개발 버전으로 업데이트해야합니다. 개발 버전으로

나는이있다 : 당신이 당신의 줄에 괄호가 없기 때문에

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

이입니다. 여기에 좋은 라인이 있습니다 :

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

그러나 우리는 여전히 예기치 않은 결과가 있습니다! 문제는 Theano가 bool을 지원하지 않는다는 것입니다. int8에서 ~를 수행하면 1 비트가 아닌 8 비트에서 비트 반전이 수행됩니다. 그것은이 결과 제공 :

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

당신은 제거 할 수 있습니다를이와 함께 ~ :

>>> that[(that<5).nonzero()].max().eval() 
array(4, dtype=int32) 
음, 두 번째의 문자 역 추적 배열이`제로()`방법이 없음을 말하고있다
+1

좋은 물건, 고마워. 그러나 나는 당신이 "개발 버전"을 의미하는 것에 약간 혼란 스럽습니다. 내가 읽은 "최첨단"인가? 그게 실험적이지 않니? –

+0

0이 아닌()은 Theano 0.7 출시 – sim

+0

@nouiz의 일부입니다. 멋진 답변 1에 대해 감사드립니다. –

관련 문제