Argument TensorFlow Strides
Próbuję zrozumieć argumentstrides w tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d.
Dokumentacja wielokrotnie mówi
Moje pytania to:Strides: lista wejść, które mają długość > = 4. Przesunięcie okna przesuwnego dla każdego wymiaru tensora wejściowego.
- co oznacza każda z 4+ liczb całkowitych?
- dlaczego muszą mieć strides [0] = strides [3] = 1 dla convnets?
- W ten przykład widzimy
tf.reshape(_X,shape=[-1, 28, 28, 1])
. Dlaczego -1?
Niestety przykłady w dokumentach do zmiany kształtu przy użyciu -1 nie tłumaczą się zbyt dobrze do tego scenariusza.
4 answers
Operacje zbiorcze i konwolucyjne przesuwają "okno" po tensorze wejściowym. Za pomocą tf.nn.conv2d
dla przykładu: jeśli tensor wejściowy ma 4 Wymiary: [batch, height, width, channels]
, to splot działa na oknie 2D o wymiarach height, width
.
strides
określa, o ile okno przesuwa się w każdym z wymiarów. Typowe zastosowanie ustawia pierwszy (wsad) i ostatni (głębokość) krok na 1.
Użyjmy bardzo konkretnego przykładu: uruchamianie splotu 2-d na 32x32 obraz wejściowy w skali szarości. Mówię greyscale, ponieważ wtedy obraz wejściowy ma depth=1, co pomaga zachować to proste. Niech ten obraz wygląda tak:
00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...
Uruchom okno splotu 2x2 na jednym przykładzie (rozmiar wsadu = 1). Podamy głębokość kanału wyjściowego 8.
Wejście do splotu ma shape=[1, 32, 32, 1]
.
Jeśli podasz strides=[1,1,1,1]
z padding=SAME
, to wyjście filtra będzie [1, 32, 32, 8].
Filtr najpierw utworzy wyjście dla:
F(00 01
10 11)
A następnie dla:
F(01 02
11 12)
I tak dalej. Następnie przeniesie się do drugiego rzędu, obliczając:
F(10, 11
20, 21)
Then
F(11, 12
21, 22)
Jeśli określisz Krok [1, 2, 2, 1], to nie spowoduje nakładania się okien. Obliczy:
F(00, 01
10, 11)
A potem
F(02, 03
12, 13)
Stride działa podobnie dla operatorów poolingu.
Pytanie 2: Dlaczego strides [1, x, y, 1] dla convnets
Pierwsze 1 to partia: nie zazwyczaj chcesz pominąć przykłady w swojej partii, lub nie powinieneś ich w ogóle uwzględniać. :)
Ostatni 1 to głębokość splotu: zazwyczaj nie chcesz pomijać wejść, z tego samego powodu.
Operator conv2d jest bardziej ogólny, więc można tworzyć sploty przesuwające okno wzdłuż innych wymiarów, ale nie jest to typowe zastosowanie w convnetach. Typowym zastosowaniem jest wykorzystanie ich przestrzennie.
Dlaczego przekształcić do -1 -1 jest symbolem zastępczym z napisem " Dostosuj w razie potrzeby, aby dopasować rozmiar potrzebny dla pełnego tensora."Jest to sposób na uniezależnienie kodu od wielkości wsadu, dzięki czemu można zmieniać rurociąg i nie trzeba dostosowywać rozmiaru wsadu wszędzie w kodzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 21:47:07
Dane wejściowe są 4 wymiarowe i mają postać: [batch_size, image_rows, image_cols, number_of_colors]
Kroki ogólnie definiują nakładanie się operacji. W przypadku filtrów conv2d określa się odległość między kolejnymi zastosowaniami filtrów convolutional. Wartość 1 w określonym wymiarze oznacza, że zastosujemy operator w każdym wierszu/col, wartość 2 oznacza co sekundę, i tak dalej.
Re 1) wartości, które mają znaczenie dla splotów to 2. i 3rd i reprezentują nakładanie się w zastosowaniu filtrów konwolucyjnych wzdłuż wierszy i kolumn. Wartość [1, 2, 2, 1] mówi, że chcemy zastosować filtry w co drugim wierszu i kolumnie.
Re 2) nie znam ograniczeń technicznych (może być wymóg CuDNN), ale zazwyczaj ludzie używają kroków wzdłuż wymiarów wierszy lub kolumn. Nie ma sensu robić tego w stosunku do wielkości partii. Nie jestem pewien ostatni wymiar.
Re 3) Ustawienie -1 dla jednego z wymiar oznacza, "ustaw wartość dla pierwszego wymiaru tak, aby całkowita liczba elementów w tensorze nie uległa zmianie". W naszym przypadku -1 będzie równe batch_size.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 21:20:22
Zacznijmy od tego, co stride robi w przypadku 1-dim.
Załóżmy, że Twoje input = [1, 0, 2, 3, 0, 1, 1]
i kernel = [2, 1, 3]
wynikiem splotu jest [8, 11, 7, 9, 4]
, który jest obliczany przez przesuwanie jądra po wejściu, wykonywanie mnożenia elementów i sumowanie wszystkiego. Like this :
- 8 = 1 * 2 + 0 * 1 + 2 * 3
- 11 = 0 * 2 + 2 * 1 + 3 * 3
- 7 = 2 * 2 + 3 * 1 + 0 * 3
- 9 = 3 * 2 + 0 * 1 + 1 * 3
- 4 = 0 * 2 + 1 * 1 + 1 * 3
Tutaj przesuwamy się o jeden element, ale nic nie zatrzymuje cię przez użycie innej liczby. Ta liczba to twój krok. Możesz myśleć o tym jako o downsamplingu wyniku 1-krokowego splotu, biorąc po prostu każdy wynik s-th.
Znając wielkość wejściową i , rozmiar jądra k, stride s i padding p można łatwo obliczyć wielkość wyjściową splotu jako:
Tutaj / / operator oznacza pułap operacja. Dla warstwy zbiorczej s = 1.
N-dim case.
Znając matematykę dla 1-dim przypadku, N-dim przypadku jest łatwe, gdy widzisz, że każdy dim jest niezależny. Więc po prostu przesuwasz każdy wymiar osobno. Oto przykład dla 2-D . Zauważ, że nie musisz mieć tego samego kroku we wszystkich wymiarach. Więc dla N-dim input / kernel powinieneś podać N kroków.
Więc teraz łatwo jest odpowiedzieć na wszystkie Twoje pytania:
- Co zrobić każda z 4 + liczb całkowitych reprezentuje?. conv2d, pool mówi ci, że ta lista reprezentuje kroki pomiędzy każdym wymiarem. Zauważ, że długość listy kroków jest taka sama jak ranga tensora jądra.
- dlaczego muszą mieć strides[0] = strides3 = 1 na convnets?. Pierwszy wymiar to wielkość partii, ostatni to kanały. Nie ma sensu pomijać ani partii, ani kanału. Więc zrób je 1. Dla szerokości/wysokości można coś pominąć i dlatego mogą nie być 1.
-
tf.reshape (_x, shape=[-1, 28, 28, 1]). Dlaczego -1? tf.reshape ma to dla Ciebie:
Jeśli jeden składnik kształtu jest wartością specjalną -1, wielkość tego wymiaru jest obliczana tak, że całkowita wielkość pozostaje stała. W szczególności kształt [-1] spłaszcza się do 1-D. co najwyżej jeden składnik kształtu może być -1.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-13 18:32:33
@dga zrobił wspaniałą robotę wyjaśniając i nie mogę być wystarczająco wdzięczny, jak pomocny to było. W podobny sposób podzielę się swoimi spostrzeżeniami na temat tego, jak stride
działa w splotach 3D.
Zgodnie z dokumentacją TensorFlow na conv3d, kształt Wejścia musi być w następującej kolejności:
[batch, in_depth, in_height, in_width, in_channels]
Wyjaśnijmy zmienne od skrajnej prawej do lewej za pomocą przykładu. Zakładając, że kształt wejścia jest
input_shape = [1000,16,112,112,3]
input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.
Poniżej znajduje się podsumowanie dokumentacja dotycząca sposobu stosowania stride.
Strides: lista wejść, które mają długość > = 5. 1-D tensor długości 5. Krok okna przesuwnego dla każdego wymiaru wejścia. Musi mieć
strides[0] = strides[4] = 1
Jak wskazano w wielu pracach, kroki oznaczają po prostu, ile kroków od okna lub jądra skacze od najbliższego elementu, czy to ramki danych lub piksela (jest to parafrazowane przy okazji).
Z powyższej dokumentacji krok w 3D będzie wyglądał tak = (1, X,Y,Z , 1).
Dokumentacja podkreśla, że strides[0] = strides[4] = 1
.
strides[0]=1 means that we do not want to skip any data in the batch
strides[4]=1 means that we do not want to skip in the channel
Strides [X] oznacza, ile przeskoków powinniśmy wykonać w ramkach. Na przykład, jeśli mamy 16 klatek, X=1 oznacza użycie każdej klatki. X = 2 oznacza użycie co drugiej klatki i trwa
Kroki [y] i kroki [z] postępuj zgodnie z wyjaśnieniem @dga więc nie będę powtarzał tej części.
W keras jednak wystarczy podać krotkę / listę 3 liczby całkowite, określające stopnie splotu wzdłuż każdego wymiaru przestrzennego, gdzie wymiarem przestrzennym są stopnie [x], stopnie [y] i stopnie [z]. strides[0] i strides[4] jest już domyślnie ustawione na 1.
Mam nadzieję, że komuś to pomoże!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 03:26:56