Argument TensorFlow Strides

Próbuję zrozumieć argumentstrides w tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d.

Dokumentacja wielokrotnie mówi

Strides: lista wejść, które mają długość > = 4. Przesunięcie okna przesuwnego dla każdego wymiaru tensora wejściowego.

Moje pytania to:
  1. co oznacza każda z 4+ liczb całkowitych?
  2. dlaczego muszą mieć strides [0] = strides [3] = 1 dla convnets?
  3. 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.

Author: jfbeltran, 2016-01-06

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.

 206
Author: dga,
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.

 15
Author: Rafał Józefowicz,
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 wpisz opis obrazka

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:

  1. 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.
  2. 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.
  3. 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.

 8
Author: Salvador Dali,
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!
 1
Author: rocksyne,
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