2017-05-17 11 views
7

Mam następujący kodTheano przełącznik row-mądry skutecznie

output = T.switch(cond, a, b) 

gdzie cond jest tensora (N,1) bool, natomiast a i b(N, M) Tensory liczbowe z M jest dość duża. Warunek działa w sposób liniowy.

Mogę łatwo zmienić przełącznik, uruchamiając T.repeat() na cond, ale jest to dość powolne. Czy istnieje sposób, w jaki mogę skutecznie sprawić, że boole w cond zdecydują, czy należy zwrócić wartość a lub b?

Odpowiedz

3

Czy istnieje sposób, w jaki mogę skutecznie sprawić, że boole w stanie decydować, czy a lub b powinny zostać zwrócone?

Tak, można zrobić

cond * a + (1-cond) * b 

cond będzie transmitowana do (N, M) kształtu.

Powinno to być zbliżone do teoretycznego limitu, czyli przepustowości pamięci: ta operacja musi przeczytać około N*M elementów i napisać N*M.

Zamiast tego odczytujemy 2*N*M, ale usuwamy logikę warunkową.

(nie mam Theano przede mną, więc nie jestem pewien, czy to szybciej niż T.switch, ale powinno być tak dobre, jak to się robi. Również chciałbym spróbować odlewania cond do tej samej dtype jak a i b)


Jeśli chcesz zaktualizować a w miejscu, można to zrobić za pomocą T.set_subtensor:

a = np.random.uniform(size=(N, M)).astype(np.float32) 
b = np.random.uniform(size=(N, M)).astype(np.float32) 

a = theano.shared(a) 
b = theano.shared(b) 

c = T.vector() # mostly 0, presumably (1-cond) 

nz = T.nonzero(c) 

s = T.set_subtensor(a[nz], b[nz]) 
fn = theano.function([c], [], updates=[(a, s)]) 

... 

fn(1-cond) 

To może lub nie może być szybsze t han pierwsze podejście, w zależności od N, M i innych czynników.

+0

Dzięki za odpowiedź, wypróbuję to! Interesujące myśli o teoretycznym limicie. Sądzę, że mogłem uniknąć dużych odczytów i zapisów, wykorzystując to, że najczęściej "a" byłoby odpowiednią wartością do powrotu i to jest w porządku, aby metoda zmodyfikowała 'a' bezpośrednio. Załóżmy, że tylko 5% czasu 'b' powinno zostać zwrócone dla danego wiersza, czy nie można uzyskać lepszej wydajności poprzez modyfikowanie' a' bezpośrednio tylko w wierszach wymagających modyfikacji? – pir

+0

@pir Czy optymalizujesz procesor lub GPU? Jakie są typowe N, N i dtype? – MaxB

+0

@pir również, czy jest to część NN czy coś, co wymaga gradientu? – MaxB