Jak obsługiwać obrazy o dużych rozmiarach w CNN?

15

Przypuśćmy, że w CNN jest wymaganych 10 000 obrazów o rozmiarach 2400 x 2400. W moim przekonaniu przydatne będą konwencjonalne komputery, z których będą korzystać ludzie. Teraz pytanie brzmi, jak radzić sobie z tak dużymi rozmiarami obrazu, w których nie ma uprawnień do próbkowania w dół.

Oto wymagania systemowe: -

Ubuntu 16.04 64-bit RAM 16 GB GPU 8 GB HDD 500 GB

1) Czy są jakieś techniki obsługi tak dużych obrazów, które należy trenować?
2) Jaki rozmiar partii jest uzasadniony w użyciu?
3) Czy mogę podjąć jakieś środki ostrożności lub zwiększyć lub zmniejszyć zasoby sprzętowe?

WaterRocket8236
źródło

Odpowiedzi:

14

Teraz pytanie brzmi, jak radzić sobie z tak dużymi rozmiarami obrazu, w których nie ma uprawnień do próbkowania w dół

Zakładam, że przez próbkowanie w dół masz na myśli zmniejszenie wejścia przed przekazaniem go do CNN. Warstwa konwolucyjna pozwala na próbkowanie w dół obrazu w sieci poprzez wybranie dużego kroku, który pozwoli zaoszczędzić zasoby na kolejne warstwy. W rzeczywistości to właśnie musi zrobić, w przeciwnym razie twój model nie zmieści się w GPU.

1) Czy są jakieś techniki obsługi tak dużych obrazów, które należy trenować?

Zwykle badania skalują obrazy do rezonansowego rozmiaru. Ale jeśli nie jest to dla ciebie opcja, musisz ograniczyć swój CNN. Oprócz próbkowania w dół na wczesnych warstwach, polecam pozbyć się warstwy FC (która zwykle przyjmuje większość parametrów) na korzyść warstwy splotowej . Będziesz także musiał przesyłać strumieniowo swoje dane w każdej epoce, ponieważ nie będą pasować do twojego GPU.

Zauważ, że nic z tego nie zapobiegnie dużemu obciążeniu obliczeniowemu we wczesnych warstwach, właśnie dlatego, że dane wejściowe są tak duże: splot jest kosztowną operacją, a pierwsze warstwy wykonają wiele z nich przy każdym przejściu do przodu i do tyłu. Krótko mówiąc, trening będzie wolny.

2) Jaki rozmiar partii jest uzasadniony w użyciu?

Oto kolejny problem. Pojedynczy obraz zajmuje 2400x2400x3x4(3 kanały i 4 bajty na piksel), co stanowi ~ 70 Mb, więc nie możesz sobie pozwolić nawet na wielkość partii 10. Bardziej realistycznie byłoby 5. Pamiętaj, że większość pamięci zajmie parametry CNN. Myślę, że w tym przypadku sensowne jest zmniejszenie rozmiaru przy użyciu 16-bitowych wartości zamiast 32-bitowych - w ten sposób będziesz w stanie podwoić partie.

3) Czy mogę podjąć jakieś środki ostrożności lub zwiększyć lub zmniejszyć zasoby sprzętowe?

Twoim wąskim gardłem jest pamięć GPU. Jeśli możesz sobie pozwolić na inny procesor graficzny, zdobądź go i podziel sieć na nie. Wszystko inne jest nieznaczne w porównaniu do pamięci GPU.

Maksyma
źródło
1
Dziękuję Ci. Przestrzegałem już kilku sugestii podanych w tej odpowiedzi. Dobra odpowiedź.
WaterRocket8236,
5

Zwykle dla obrazów zestawem funkcji są wartości gęstości pikseli, w tym przypadku prowadzi to do całkiem dużego zestawu funkcji; również próbkowanie w dół obrazów nie jest również zalecane, ponieważ możesz stracić (faktycznie stracisz) ważne dane.

[1] Istnieją jednak techniki, które mogą pomóc w zmniejszeniu rozmiaru zestawu funkcji, podejścia takie jak PCA (Principle Component Analysis) pomagają w wyborze ważnego podzbioru funkcji.

Aby uzyskać szczegółowe informacje, patrz link http://spark.apache.org/docs/latest/ml-features.html#pca .

[2] Oprócz tego, aby zmniejszyć koszty obliczeniowe podczas treningu sieci neuronowej, możesz użyć Stochastic Gradient Descent, zamiast konwencjonalnego zastosowania podejścia Gradient Descent, co zmniejszyłoby rozmiar zbioru danych wymaganego do treningu w każdej iteracji. W ten sposób rozmiar zestawu danych do użycia w jednej iteracji skróciłby, a tym samym skróciłby czas potrzebny na szkolenie sieci.

Dokładny rozmiar partii, który należy zastosować, zależy od dystrybucji zbioru danych szkoleniowych i zestawu danych testowych, bardziej ogólne zastosowanie to 70-30. Gdzie można również zastosować wyżej wspomniane podejście stochastyczne, aby skrócić wymagany czas.

Szczegóły stochastycznego zejścia gradientu http://scikit-learn.org/stable/modules/sgd.html

[3] Sprzęt wydaje się odpowiedni do aktualizacji byłby wymagany, ale w razie potrzeby spójrz na rozwiązania chmurowe, takie jak AWS, w których możesz uzyskać bezpłatną subskrypcję konta do limitu użytkowania.

Karan Chopra
źródło
Dziękuję za Twoją odpowiedź. Zaktualizuj odpowiedź, jeśli uzyskasz więcej informacji.
WaterRocket8236
Dzięki za ten link na Stochastic Gradient Descent i witamy w AI!
DukeZhou
2

Tak dużych danych nie można załadować do pamięci. Podzielmy to, co możesz zrobić na dwa:

  1. Przeskaluj wszystkie swoje obrazy do mniejszych wymiarów. Możesz przeskalować je do 112 x 112 pikseli. W twoim przypadku, ponieważ masz kwadratowy obraz, nie będzie potrzeby przycinania. Nadal nie będziesz w stanie załadować wszystkich tych obrazów do pamięci RAM w jednym celu.

  2. Najlepszą opcją jest użycie funkcji generatora, która będzie podawać dane partiami. Proszę odnieść się do użycia fit_generator stosowanego w Keras. Jeśli parametry modelu stają się zbyt duże, aby zmieściły się w pamięci GPU, rozważ zastosowanie normalizacji wsadowej lub modelu resztkowego, aby zmniejszyć liczbę parametrów.

rocksyne
źródło
3
Dlaczego miałbyś wybrać rozmiar 112 x 112 pikseli? To nie jest potencja 2, a nie dzielnik 2400.
Andi R
@AndiR. Oto rzecz. Jeśli chodzi o wymiar wejściowy, można wybrać dowolny rozmiar. Wynika to z faktu, że jeśli w sieci występują jakieś niezgodności wymiarów, można to łatwo rozwiązać za pomocą zerowania. Dlatego nie ma ustalonej metodologii dotyczącej wielkości danych wejściowych. Należy jednak uważać, aby zbyt dużo próbkowania w dół nie wpłynęło na jakość wejściową. Proszę spojrzeć na ten artykuł, który wykorzystuje wymiar 112x112. ( cv-foundation.org/openaccess/content_iccv_2015/papers/… )
rocksyne