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.
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
@pir Czy optymalizujesz procesor lub GPU? Jakie są typowe N, N i dtype? – MaxB
@pir również, czy jest to część NN czy coś, co wymaga gradientu? – MaxB