Jaka jest różnica między „sam” i „skuteczne” w wyściółką tf.nn.max_pool
z tensorflow
?
Moim zdaniem „WAŻNE” oznacza, że nie będzie zerowania na krawędziach, gdy wykonamy maksymalną pulę.
Według Przewodnika po arytmetyki splotowej dla głębokiego uczenia się , mówi, że operator puli nie będzie wypełniał, tj. Po prostu użyje „WAŻNE” z tensorflow
. Ale w czym jest wypełnienie „SAME” maksymalnej puli tensorflow
?
python
tensorflow
deep-learning
karl_TUM
źródło
źródło
Odpowiedzi:
Podam przykład, aby wyjaśnić:
x
: obraz wejściowy o kształcie [2, 3], 1 kanałvalid_pad
: maksymalna pula z jądrem 2x2, krok 2 i WAŻNE wypełnienie.same_pad
: maksymalna pula z jądrem 2x2, stride 2 i SAME wypełnienie (jest to klasyczny sposób)Kształty wyjściowe to:
valid_pad
: tutaj, bez dopełnienia, więc kształt wyjściowy to [1, 1]same_pad
: tutaj dopełniamy obraz do kształtu [2, 4] (za pomocą,-inf
a następnie stosujemy maksymalną pulę), więc kształt wyjściowy to [1, 2]źródło
Jeśli lubisz sztukę ascii:
"VALID"
= bez wypełnienia:"SAME"
= z zerowym wypełnieniem:W tym przykładzie:
Uwagi:
"VALID"
tylko upuszcza kolumny najbardziej po prawej (lub wiersze o najniższej pozycji)."SAME"
próbuje przesunąć równomiernie po lewej i prawej stronie, ale jeśli liczba dodawanych kolumn jest nieparzysta, doda dodatkową kolumnę po prawej stronie, jak ma to miejsce w tym przykładzie (ta sama logika obowiązuje w pionie: może być dodatkowy wiersz zer na dole).Edytuj :
O nazwie:
"SAME"
paddingu, jeśli użyjesz kroku 1, wyjścia warstwy będą miały takie same wymiary przestrzenne jak jej wejścia."VALID"
paddingu nie ma „gotowych” wkładek padding. Warstwa wykorzystuje tylko prawidłowe dane wejściowe.źródło
-inf
.Kiedy
stride
jest 1 (bardziej typowy dla splotu niż łączenia), możemy pomyśleć o następującym rozróżnieniu:"SAME"
: rozmiar wyjściowy jest taki sam jak rozmiar wejściowy. Wymaga to, aby okno filtra wyślizgnęło się poza mapę wprowadzania, stąd potrzeba wypełnienia."VALID"
: Okno filtru pozostaje w prawidłowej pozycji na mapie wejściowej, więc rozmiar wyjściowy zmniejsza się ofilter_size - 1
. Nie występuje padding.źródło
SAME
iVALID
może równie dobrze zostały nazwanefoo
ibar
Przykład TensorFlow Convolution zawiera przegląd różnic między
SAME
iVALID
:W przypadku
SAME
wypełnienia wysokość i szerokość wyjściowa są obliczane jako:I
W przypadku
VALID
wypełnienia wysokość i szerokość wyjściowa są obliczane jako:źródło
Wypełnianie to operacja polegająca na zwiększeniu rozmiaru danych wejściowych. W przypadku danych 1-wymiarowych po prostu dodajesz / dodajesz tablicę ze stałą, w 2-dim otaczasz macierz tymi stałymi. W n-dim otaczasz hipersześcian n-dim stałą. W większości przypadków stała ta wynosi zero i nazywa się ją wypełnianiem zerowym.
Oto przykład wypełnienia zerowego
p=1
zastosowanego do tensora 2-d:Możesz użyć dowolnego wypełnienia dla swojego jądra, ale niektóre wartości wypełnienia są używane częściej niż inne:
k
k
ta wypełnienie jest równak - 1
.Aby użyć dowolnego wypełnienia w TF, możesz użyć
tf.pad()
źródło
Szybkie wyjaśnienie
VALID
: Nie stosuj żadnego dopełnienia, tzn. Załóż, że wszystkie wymiary są prawidłowe, aby obraz wejściowy był w pełni objęty przez filtr i krok określony przez Ciebie.SAME
: Zastosuj dopełnienie do danych wejściowych (w razie potrzeby), aby obraz wejściowy został w pełni pokryty przez określony filtr i krok. W kroku 1 zapewni to, że rozmiar obrazu wyjściowego będzie taki sam jak na wejściu.Notatki
NO_PADDING
.AUTO_PADDING
.SAME
(tj. W trybie automatycznego padu) Tensorflow będzie próbował równomiernie rozłożyć wypełnienie zarówno po lewej, jak i po prawej stronie.VALID
(tj. Bez trybu wypełniania), Tensorflow spadnie w prawo i / lub dolne komórki, jeśli twój filtr i krok nie pokrywają w pełni obrazu wejściowego.źródło
Cytuję tę odpowiedź z oficjalnych dokumentów tensorflow https://www.tensorflow.org/api_guides/python/nn#Convolution W przypadku wypełnienia „SAME” wysokość i szerokość wyjściowa są obliczane jako:
a wypełnienie u góry i po lewej stronie jest obliczane jako:
W przypadku wypełnienia „WAŻNE” wysokość i szerokość wyjściowa są obliczane jako:
a wartości wypełnienia są zawsze równe zero.
źródło
Istnieją trzy opcje wypełnienia: prawidłowe (bez wypełnienia), takie same (lub pół), pełne. Wyjaśnienia (w Theano) znajdziesz tutaj: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
Prawidłowe wypełnienie nie obejmuje wypełniania zerami, więc obejmuje tylko prawidłowe dane wejściowe, nie licząc sztucznie wygenerowanych zer. Długość wyjścia wynosi ((długość wejścia) - (k-1)) dla rozmiaru jądra k, jeśli krok s = 1.
To samo wypełnienie sprawia, że wielkość wyjściowa jest taka sama jak wielkość wejściowa, gdy s = 1. Jeśli s = 1, liczba zerowanych dopełnień wynosi (k-1).
Pełne wypełnienie oznacza, że jądro przebiega przez wszystkie dane wejściowe, więc na końcach jądro może spełniać tylko jedno wejście, a pozostałe zero. Liczba dopełnianych zer wynosi 2 (k-1), jeśli s = 1. Długość wyjścia wynosi ((długość wejścia) + (k-1)), jeżeli s = 1.
Dlatego liczba wypełnień: (ważna) <= (ta sama) <= (pełna)
źródło
Padding on / off. Określa efektywny rozmiar danych wejściowych.
VALID:
Bez wyściółki. Operacje zwojowe itp. Są wykonywane tylko w miejscach, które są „ważne”, tj. Niezbyt blisko granic tensora.Z jądrem 3x3 i obrazem 10x10, wykonałbyś splot na obszarze 8x8 wewnątrz granic.
SAME:
Wypełnienie jest zapewnione. Ilekroć twoja operacja odwołuje się do sąsiedztwa (bez względu na to, jak duże), wartości zerowe są podawane, gdy sąsiedztwo wystaje poza pierwotny tensor, aby umożliwić tej operacji działanie również na wartościach granicznych.Z jądrem 3x3 i obrazem 10x10 wykonujesz splot na pełnym obszarze 10x10.
źródło
WAŻNE wypełnienie: jest to wypełnienie zerowe. Mam nadzieję, że nie ma zamieszania.
SAME wypełnienie: Jest to trochę trudne do zrozumienia w pierwszej kolejności, ponieważ musimy rozważyć dwa warunki oddzielnie, jak wspomniano w oficjalnych dokumentach .
Weźmy dane wejściowe jako , dane wyjściowe jako , wypełnienie jako , krok jako i rozmiar jądra jako (rozważany jest tylko jeden wymiar)
Przypadek 01 :
Przypadek 02 :
oblicza się w taki sposób, aby minimalną wartość, jaką można przyjąć dla wypełnienia. Ponieważ wartość jest znana, wartość można znaleźć za pomocą tego wzoru .
Opracujmy ten przykład:
Tutaj wymiar x wynosi (3,4). Następnie, jeśli zostanie przyjęty kierunek poziomy (3):
Jeśli zostanie wybrany kierunek pionowy (4):
Mam nadzieję, że pomoże to zrozumieć, w jaki sposób SAME wypełnienie działa w TF.
źródło
W oparciu o wyjaśnienie tutaj i po odpowiedzi Tristana zwykle używam tych szybkich funkcji do sprawdzania rozsądku.
źródło
Podsumowując, „prawidłowe” wypełnienie oznacza brak wypełnienia. Rozmiar wyjściowy warstwy splotowej kurczy się w zależności od rozmiaru wejściowego i rozmiaru jądra.
Przeciwnie, „to samo” wypełnienie oznacza użycie wypełnienia. Gdy krok jest ustawiony na 1, rozmiar wyjściowy warstwy splotowej zachowuje się jak rozmiar wejściowy, dodając pewną liczbę „granicy 0” wokół danych wejściowych podczas obliczania splotu.
Mam nadzieję, że ten intuicyjny opis pomoże.
źródło
Tutaj W i H oznaczają szerokość i wysokość wejścia, F to wymiary filtra, P to rozmiar wypełnienia (tj. Liczba wierszy lub kolumn do wypełnienia)
W przypadku SAMEGO wypełnienia:
W przypadku ważnego wypełnienia:
źródło
Uzupełniając świetną odpowiedź YvesgereY, ta wizualizacja okazała się niezwykle pomocna:
Padding „ valid ” to pierwsza cyfra. Okno filtru pozostaje wewnątrz obrazu.
Padding „ same ” to trzecia cyfra. Dane wyjściowe są tego samego rozmiaru.
Znalazłem to w tym artykule .
źródło
Odpowiedź zgodna z Tensorflow 2.0 : powyżej podano szczegółowe objaśnienia dotyczące „Ważnego” i „tego samego” wypełnienia.
Jednak
Tensorflow 2.x (>= 2.0)
z korzyścią dla społeczności określę różne funkcje łączenia i ich odpowiednie polecenia .Funkcje w 1.x :
tf.nn.max_pool
tf.keras.layers.MaxPool2D
Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D
Funkcje w wersji 2.x :
tf.nn.max_pool
jeśli jest używany w wersji 2.x itf.compat.v1.nn.max_pool_v2
lubtf.compat.v2.nn.max_pool
, jeśli migrowany z wersji 1.x do wersji 2.x.tf.keras.layers.MaxPool2D
jeśli używany w 2.xitf.compat.v1.keras.layers.MaxPool2D
lubtf.compat.v1.keras.layers.MaxPooling2D
lubtf.compat.v2.keras.layers.MaxPool2D
lubtf.compat.v2.keras.layers.MaxPooling2D
, w przypadku migracji z wersji 1.x do wersji 2.x.Average Pooling => tf.nn.avg_pool2d
lubtf.keras.layers.AveragePooling2D
jeśli jest używany w TF 2.x itf.compat.v1.nn.avg_pool_v2
lubtf.compat.v2.nn.avg_pool
lubtf.compat.v1.keras.layers.AveragePooling2D
lubtf.compat.v1.keras.layers.AvgPool2D
lubtf.compat.v2.keras.layers.AveragePooling2D
lubtf.compat.v2.keras.layers.AvgPool2D
, w przypadku migracji z wersji 1.x do wersji 2.x.Więcej informacji na temat migracji z Tensorflow 1.x do 2.x można znaleźć w niniejszym przewodniku migracji .
źródło