2016-02-29 11 views
16

TL.DR. Czy istnieje 3-wymiarowa, przyjazna implementacja theano.tensor.nnet.neighbours.images2neibs?Przesuwne okno 3D w Theano?

Chciałbym wykonać voxel-mądry podział woluminu (NxNxN) za pomocą sieci neuronowej, która przyjmuje obraz nxnxn, gdzie N> n. Aby zaklasyfikować każdy woksel w woluminie, muszę iterować przez każdy woksel. Dla każdego iteracji uzyskuję i przekazuję woksele sąsiedztwa jako dane wejściowe do sieci neuronowej. Jest to po prostu przesuwana operacja okna, której operacją jest sieć neuronowa.

Podczas gdy moja sieć neuronowa jest zaimplementowana w Theano, implementacja okna przesuwnego jest w python/numpy. Ponieważ nie jest to czysta operacja Theano, klasyfikacja trwa wiecznie (> 3 godziny), aby sklasyfikować wszystkie woksele w jednym woluminie. Dla operacji przesuwania okna 2d, Theano ma metodę pomocniczą, theano.tensor.nnet.neighbours.images2neibs, czy istnieje podobna implementacja dla obrazów trójwymiarowych?

Edycja: Istnieje istniejące rozwiązania NumPy (1 i 2) do okienka n-D przesuwne, zarówno w celu zapewnienia wykorzystania np.lib.stride_tricks.as_strided widokach okna przesuwnego ', zapobiegając w ten sposób problemów z pamięcią. W mojej implementacji przesuwne tablice okien są przekazywane z numpy (Cython) do Pythona, a następnie do Theano. Aby zwiększyć wydajność, najprawdopodobniej muszę ominąć język Python.

+0

powiązane omówienie. https://github.com/Theano/Theano/issues/2166 – teng

+1

Alternatywnie, może chcesz sprawdzić 'sklearn.feature_extraction.image.extract_patches'. To da ci widok na pożądane kostki 'nxnxn' bez tworzenia kopii danych. Połącz go z 'np.einsum', który również nie kopiuje i możesz dostać coś, co działa w akceptowalnym czasie (bez gwarancji, nigdy nie próbowałem) – eickenberg

+0

Dzięki Eickenberg. Muszę rzucić okiem na "np.einsum"! – teng

Odpowiedz

0

Narzędzie OverfeatTransformer firmy Eickenberg and Kastner w sklearn_theano.feature_extraction.overfeat byłoby dobrym rozwiązaniem dla tej operacji, o czym wspomina OP.