2013-05-31 35 views
6

Tôi đang cố gắng tối đa hóa một vectơ cho một giá trị boolean.Theano: Tại sao việc lập chỉ mục thất bại trong trường hợp này?

Với NumPy:

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

Nhưng với 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' 

Tại sao điều này xảy ra? Đây có phải là một sắc thái tinh tế mà tôi đang thiếu?

+0

Vâng, traceback đen cho thứ hai của bạn đang nói rằng mảng không có khác không() 'phương pháp'/thuộc tính, vì vậy bạn không thể sử dụng nó theo cùng cách mà bạn sẽ sử dụng một mảng numpy. –

+0

@JeffTratner: Phản đối [ví dụ] (http://deeplearning.net/software/theano/library/tensor/basic.html#indexing) được cung cấp trên trang web ... –

+1

@NoobSailbot bạn đang sử dụng đúng phiên bản? –

Trả lời

9

Bạn đang sử dụng phiên bản Theano quá cũ. Trong thực tế, tensor_var.nonzero() không có trong bất kỳ phiên bản phát hành nào. Bạn cần cập nhật lên phiên bản phát triển.

Với phiên bản phát triển Tôi có điều này:

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

Điều này là do bạn đang thiếu ngoặc phù hợp của bạn. Đây là dòng tốt:

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

Nhưng chúng tôi vẫn có kết quả bất ngờ! Vấn đề là Theano không hỗ trợ bool. Làm ~ trên int8, đang làm ngược bitwise trên 8 bit, không phải 1 bit. Nó cho kết quả này:

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

Bạn có thể loại bỏ các ~ với điều này:

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

Nội dung hay, cảm ơn bạn. Nhưng tôi là một chút bối rối về những gì bạn có nghĩa là bởi "phiên bản phát triển". Đó là "chảy máu cạnh" tôi đọc về? Đó không phải là thử nghiệm sao? –

+0

nonzero() là một phần của Theano 0.7 phát hành – sim

+0

@nouiz, tôi chỉ muốn nói, cảm ơn một triệu cho câu trả lời tuyệt vời của bạn +1. –

Các vấn đề liên quan