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.
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.
źródło
Tak dużych danych nie można załadować do pamięci. Podzielmy to, co możesz zrobić na dwa:
źródło