@StatsSorceress TL; DR:
Przechodzę przez tę aktywność, aby sprawdzić, czy mogę samodzielnie obliczyć wymaganą pamięć:
Aktywacje: 532,752 * 2 * 4 / (1024 ^ 2) = 4,06 MB
Parametry: 19,072,984 * 4 / (1024 ^ 2) * 3 = 218,27 MB
Różne: 128 * 9 000 * 4 / (1024 ^ 2) = 4,39 MB
Całkowita pamięć: (4,06 * 128 ) + 218,27 + 4,39 = 742,34 MB
( Ktoś, proszę, popraw mnie, jeśli się mylę. FYI, już pomnożyłeś różne przez 128, więc dlatego nie pomnożyłem tego przez 128 powyżej )
Chciałbym wskazać ci ten artykuł i odpowiedni film . Pomogli mi zrozumieć, co się dzieje znacznie lepiej.
UWAGA: Pamięć wymagana do korzystania z sieci do prognoz jest znacznie mniejsza niż pamięć wymagana do szkolenia z dwóch powodów:
- Podczas przewidywania wysyłamy tylko obraz do przodu przez sieć, a nie do tyłu (więc nie mnożymy pamięci X 3; patrz poniżej)
- Istnieje jedna prognoza na obraz (więc nie musimy pomnożyć pamięci wymaganej dla jednego obrazu przez wielkość partii, ponieważ nie używamy partii w przewidywaniu).
Proces (od pamięci do pociągu)
- Oblicz pamięć potrzebną do trenowania na jednym obrazie
- Pomnóż tę liczbę przez liczbę zdjęć w partii
( PAMIĘTAJ: Mini-wsadowe mówi, że bierzemy podzbiór naszych danych, obliczamy gradienty i błędy dla każdego obrazu w tym podzbiorze, następnie uśredniamy je i idziemy w kierunku średniej. W przypadku sieci konwergentnych wagi i tendencje są wspólne, ale liczba aktywacji jest pomnożona przez liczbę obrazów w partii ).
KROK 1: Pamięć dla 1 obrazu
Aby trenować jeden obraz, musisz zarezerwować pamięć dla:
Parametry modelu:
Te ciężary i napina w każdej warstwie, ich nachylenia , a ich zmienne pędu (jeśli Adam Adagrad, RMSProp itp pozycjonujące służą)
Aby oszacować pamięć w tym celu, oblicz pamięć wymaganą do przechowywania wag i odchyleń i pomnóż ją przez 3 (tj. „Przez 3”, ponieważ mówimy, że ilość pamięci potrzebnej do przechowywania wag i odchyleń jest (z grubsza) równa potrzebne do gradientów i zmiennych pędu)
RÓWNANIA:
Zwoje:
wagi (n) = głębokość (n) * (szerokość jądra * wysokość jądra) * głębokość (n-1)
odchylenia (n) = głębokość (n)
W pełni połączone (gęste) warstwy:
wagi (n) = wyjścia (n) * wejścia (n)
odchylenia (n) = wyjścia (n)
gdzie n to bieżąca warstwa, a n-1 to poprzednia warstwa, a dane wyjściowe to liczba wyników z warstwy FC, a dane wejściowe to liczba danych wejściowych do warstwy FC (jeśli poprzednia warstwa nie jest w pełni połączoną warstwą, liczba wejść jest równa wielkości tej spłaszczonej warstwy).
UWAGA: Pamięć samych wag i odchyleń, a także pamięć dla aktywacji jednego obrazu (patrz poniżej), jest całkowitą ilością pamięci potrzebną do przewidywania (z wyłączeniem pewnego obciążenia na pamięć dla zwojów i niektórych innych rzeczy).
- Aktywacje (są to „Bloby” w Caffe):
(Używam tu swobodnie terminów, nie przejmuj się)
Każdy splot w warstwie splotu powoduje aktywację „ liczby pikseli w obrazie ” (tzn. Przekazujesz obraz przez pojedynczy splot, otrzymujesz pojedynczą mapę funkcji składającą się z aktywacji „ m ”, gdzie „ m ” jest liczbą pikseli z twojego obraz / wejście).
W przypadku w pełni połączonych warstw liczba wygenerowanych aktywacji jest równa wielkości wydruków.
Zwoje:
aktywacje (n) = image_width * image_height * image_num_channels
W pełni połączone (gęste) warstwy:
aktywacje (n) = wyjścia (n)
Zauważ, że twój wkład jest tak naprawdę tylko obrazem na początku sieci. Po splotach zamienia się w coś innego (mapy obiektów). Więc naprawdę zastąp „image_width”, „image_height” i „image_num_channels” na „input_width”, „input_height” i „layer_depth”. (Po prostu łatwiej mi myśleć o tej koncepcji w kategoriach obrazów.)
Ponieważ musimy również przechowywać błąd aktywacji na każdej warstwie (używany w przebiegu wstecznym), mnożymy liczbę aktywacji przez 2, aby uzyskać całkowitą liczbę jednostek, dla których musimy zrobić miejsce w naszej pamięci. Liczba aktywacji wzrasta wraz z liczbą obrazów w partii, więc pomnóż tę liczbę przez rozmiar partii.
KROK 2: Memory to Train Batch
Zsumuj liczbę wag i odchyleń (razy 3) i liczbę aktywacji (razy 2 razy wielkość partii). Pomnóż to przez 4, a otrzymasz liczbę bajtów wymaganych do wyszkolenia partii. Możesz podzielić przez 1024 ^ 2, aby uzyskać odpowiedź w GB.