Po co normalizować obrazy, odejmując średnią obrazową zestawu danych, zamiast aktualnej średniej w głębokim uczeniu się?

88

Istnieją pewne warianty normalizacji obrazów, ale większość wydaje się używać tych dwóch metod:

  1. Odejmij średnią na kanał obliczoną dla wszystkich zdjęć (np. VGG_ILSVRC_16_layers )
  2. Odejmij według pikseli / kanałów obliczonych na wszystkich obrazach (np. CNN_S , zobacz także sieć referencyjną Caffe )

Moim zdaniem naturalne podejście do normalizacji każdego obrazu. Zdjęcie zrobione w świetle dziennym spowoduje, że wystrzeli więcej neuronów niż zdjęcie nocne, i chociaż może poinformować nas o czasie, zwykle dbamy o bardziej interesujące cechy obecne na krawędziach itp.

Pierre Sermanet wspomina w 3.3.3, że lokalna normalizacja kontrastu byłaby oparta na obrazie, ale nie natknąłem się na to w żadnym z przykładów / samouczków, które widziałem. Widziałem także interesujące pytanie Quory i post Xiu-Shen Wei, ale wydaje się, że nie obsługują one dwóch powyższych podejść.

Czego dokładnie brakuje? Czy jest to problem z normalizacją kolorów, czy jest papier, który faktycznie wyjaśnia, dlaczego tak wielu stosuje takie podejście?

Max Gordon
źródło
Nie znam odpowiedzi, ale czy wypróbowałeś każdą z metod? Czy jest jakaś różnica w występach?
user112758
@ user112758 - ich wdrożenie jest trochę bolesne (szczególnie w przypadku piksela), a moim doświadczeniem jest to, że normalizacja na obraz działa dobrze, ale moje dane nie są tak reprezentatywne. Spróbuję eksperymentować z normalizacją, ale ciekawi mnie motywacja stojąca za tymi (moim zdaniem) dziwnymi procedurami normalizacyjnymi.
Max Gordon,
Ok, może możesz o to zapytać w grupie caffe Google Caffe problemy z GitHub. Myślę, że byłoby więcej ekspertów w tym temacie.
user112758

Odpowiedzi:

58

Odejmowanie średniej zestawu danych służy do „wyśrodkowania” danych. Dodatkowo idealnie byłoby podzielić także sttdev tej cechy lub piksela, jeśli chcesz znormalizować każdą wartość funkcji do wyniku Z.

Powodem, dla którego robimy obie te rzeczy, jest to, że w trakcie szkolenia naszej sieci będziemy zwielokrotniać (wagi) i dodawać (odchylać) te początkowe dane wejściowe, aby spowodować aktywacje, które następnie przesadzamy z gradientami do wytrenuj model.

W tym procesie chcielibyśmy, aby każda funkcja miała podobny zakres, aby nasze gradienty nie wymknęły się spod kontroli (i abyśmy potrzebowali tylko jednego globalnego mnożnika szybkości uczenia się).

Innym sposobem, w jaki możesz o tym myśleć, są sieci głębokiego uczenia, które tradycyjnie dzielą wiele parametrów - gdyby nie skalować danych wejściowych w sposób, który skutkowałby podobnymi zakresami wartości funkcji (tj. W całym zestawie danych przez odjęcie średniej), dzielenie nie zdarza się bardzo łatwo, ponieważ w jednej części obrazu wjest dużo, a w drugiej jest zbyt mała.

W niektórych modelach CNN zobaczysz, że stosuje się wybielanie na obraz, co jest bardziej zgodne z myśleniem.

Lollercoaster
źródło
4
Dziękuję za Twoją odpowiedź. Znam koncepcję centrowania danych i upewnienia się, że zakres jest podobny, aby uzyskać stabilne gradienty. Pytanie dotyczy raczej tego, dlaczego musimy to zrobić w całym zbiorze danych i dlaczego pomogłoby to w odróżnieniu od wybielania poszczególnych obrazów? Chciałbym uzyskać proste odniesienie, które w pewien sposób pokazuje, że poprawia to naukę, zanim zaakceptuję odpowiedź. Wiem, że normalizacja partii jest niezwykle skuteczną techniką, ale nie widzę związku z normalizacją całego zestawu danych.
Max Gordon
Jeśli zaakceptujesz normalizację partii, to już tam jesteś. Jedynym powodem normalizacji partii jest sytuacja, gdy nie możesz zmieścić pełnego zestawu danych w pamięci lub rozpowszechniasz szkolenie (często ten sam problem). Właśnie dlatego mamy partie.
lollercoaster
Myślałem, że partie są również podstawą stochastycznego spadku. Nawet gdybym mógł zmieścić wszystko w pamięci, chcę aktualizować parametry częściej niż po każdej epoce.
Max Gordon,
3
Oni są. I możesz aktualizować, jak często chcesz - implikacje analityczne są identyczne, co jest tak miłe i skalowalne w spadku gradientu. Powodem, dla którego używamy stochastycznego opadania gradientu (tasowanie kolejności wprowadzania + dozowanie) jest wygładzenie naszego wspinania się po przestrzeni gradientu. Biorąc pod uwagę jeden punkt, nie możemy być pewni, że nasza aktualizacja popchnie nas w kierunku lokalnych maksimów, jednak jeśli wybierzesz wystarczającą liczbę punktów, prawdopodobieństwo to wzrośnie (w oczekiwaniu).
Lollercoaster
2
W jaki sposób pomaga to uzyskać funkcje w podobnym zakresie? Jeśli mam dwa obrazy, jeden w zakresie od 0 do 255, a drugi w zakresie od 0 do 50 w pikselach, powiedzmy ze średnią 50 i stdev wynoszącą 15. Normalizacja daje mi obraz 1 w zakresie od -3,3 do 13,6 i obraz 2 w zakresie od -3,3 do 0. Wciąż nie są w tej samej skali.
Daniel,
9

Przed normalizacją partii zastosowano średnie odejmowanie na kanał, aby wyśrodkować dane wokół średniej zerowej dla każdego kanału (R, G, B). Zwykle pomaga to sieci uczyć się szybciej, ponieważ gradienty działają jednolicie dla każdego kanału. Podejrzewam, że jeśli użyjesz normalizacji wsadowej, etap wstępnego przetwarzania średniego odejmowania na kanał nie jest tak naprawdę konieczny, ponieważ i tak normalizujesz dla pojedynczej partii.

Sid M.
źródło
1
„Podejrzewam, że jeśli użyjesz normalizacji wsadowej, etap wstępnego przetwarzania średniego odejmowania na kanał nie jest tak naprawdę konieczny, ponieważ i tak normalizujesz dla pojedynczej partii. Ale norma wsadowa odnosi się do normalizacji wag w warstwach twojej sieci ... a nie rzeczywistych obrazów wejściowych. To są dwie różne rzeczy.
Monica Heddneck
4

Normalizacja poszczególnych obrazów jest powszechna i jest nawet jedyną wbudowaną funkcją w Tensorflow (przede wszystkim dlatego, że jest bardzo łatwa do wdrożenia). Jest używany z dokładnie wymienionego powodu (dzień kontra noc dla tego samego obrazu). Jeśli jednak wyobrażasz sobie bardziej idealny scenariusz, w którym kontrolowane jest oświetlenie, wówczas względne różnice między każdym obrazem będą miały dużą wartość w algorytmie i nie chcielibyśmy tego wymazać za pomocą normalizacji poszczególnych obrazów (i chcieliby wykonać normalizację w kontekście całego zestawu danych treningowych).

JPJ
źródło
4

Nazywa się to przetwarzaniem danych przed ich użyciem. Możesz przetwarzać na wiele sposobów, ale jest jeden warunek, że powinieneś przetwarzać wszystkie dane za pomocą tej samej funkcji X_preproc = f (X), a to f (.) Nie powinno zależeć od samych danych, więc jeśli użyjesz bieżącego obrazu oznacza to przetworzenie bieżący obraz, wtedy twój f (X) będzie naprawdę f (X, obraz) i nie chcesz tego.

Normalizacja kontrastu obrazu, o której mówiłeś, ma inny cel. Normalizacja kontrastu obrazu pomoże w funkcji.

Ale f (.) Powyżej pomoże w optymalizacji, utrzymując wszystkie funkcje liczbowo równe sobie (oczywiście w przybliżeniu)

Hacklavya
źródło