wake-up-neo.com

Tensorflow Strides Argument

Ich versuche das Argument der Schritte in tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d zu verstehen.

Das Dokumentation sagt immer wieder

schritte: Eine Liste von Ints mit einer Länge> = 4. Der Schritt des Schiebefensters für jede Dimension des Eingabetensors.

Meine Fragen sind:

  1. Was bedeuten die 4+ ganzen Zahlen?
  2. Warum müssen sie Strides [0] = Strides [3] = 1 für Convnets haben?
  3. In dieses Beispiel sehen wir tf.reshape(_X,shape=[-1, 28, 28, 1]). Warum -1?

Leider lassen sich die Beispiele in den Dokumenten zum Umformen mit -1 nicht so gut auf dieses Szenario übertragen.

110
jfbeltran

Die Pooling- und Faltungsoperationen schieben ein "Fenster" über den Eingangstensor. Verwenden Sie tf.nn.conv2d als Beispiel: Wenn der Eingangstensor 4 Dimensionen hat: [batch, height, width, channels], Dann bearbeitet die Faltung ein 2D-Fenster in den Dimensionen height, width .

strides legt fest, um wie viel das Fenster in den einzelnen Dimensionen verschoben wird. Die typische Verwendung setzt den ersten (die Charge) und den letzten (die Tiefe) Schritt auf 1.

Verwenden wir ein sehr konkretes Beispiel: Ausführen einer 2-D-Faltung über ein 32x32-Graustufen-Eingabebild. Ich sage Graustufen, weil das Eingabebild dann Tiefe = 1 hat, was dazu beiträgt, es einfach zu halten. Lass das Bild so aussehen:

00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...

Lassen Sie uns ein 2x2-Faltungsfenster über ein einzelnes Beispiel laufen (Stapelgröße = 1). Wir geben der Faltung eine Ausgabekanaltiefe von 8.

Die Eingabe für die Faltung hat shape=[1, 32, 32, 1].

Wenn Sie strides=[1,1,1,1] Mit padding=SAME Angeben, ist die Ausgabe des Filters [1, 32, 32, 8].

Der Filter erstellt zunächst eine Ausgabe für:

F(00 01
  10 11)

Und dann für:

F(01 02
  11 12)

und so weiter. Dann geht es in die zweite Reihe und berechnet:

F(10, 11
  20, 21)

dann

F(11, 12
  21, 22)

Wenn Sie einen Schritt von [1, 2, 2, 1] angeben, werden keine Fenster überlappt. Es wird berechnet:

F(00, 01
  10, 11)

und dann

F(02, 03
  12, 13)

Ähnlich verhält es sich bei den Pooling-Betreibern.

Frage 2: Warum Schritte [1, x, y, 1] für Convnets

Die erste 1 ist der Stapel: Normalerweise möchten Sie keine Beispiele in Ihrem Stapel überspringen, oder Sie hätten sie gar nicht erst einbeziehen sollen. :)

Die letzte 1 ist die Tiefe der Faltung: Aus dem gleichen Grund möchten Sie normalerweise keine Eingaben überspringen.

Der conv2d-Operator ist allgemeiner. Sie können also could Faltungen erstellen, die das Fenster entlang anderer Dimensionen verschieben. Dies ist jedoch keine typische Verwendung in Convnets. Die typische Verwendung besteht darin, sie räumlich zu verwenden.

Warum wird in -1 umgeformt? -1 ist ein Platzhalter mit der Aufschrift "Passen Sie ihn nach Bedarf an die Größe an, die für den vollen Tensor erforderlich ist". Auf diese Weise kann der Code unabhängig von der eingegebenen Stapelgröße erstellt werden, sodass Sie Ihre Pipeline ändern können und die Stapelgröße nicht überall im Code anpassen müssen.

217
dga

Die Eingaben sind 4-dimensional und haben folgende Form: [batch_size, image_rows, image_cols, number_of_colors]

Schritte definieren im Allgemeinen eine Überlappung zwischen dem Anwenden von Operationen. Im Fall von conv2d gibt es den Abstand zwischen aufeinanderfolgenden Anwendungen von Faltungsfiltern an. Der Wert 1 in einer bestimmten Dimension bedeutet, dass wir den Operator auf jede Zeile/Spalte anwenden, der Wert 2 auf jede Sekunde und so weiter.

Re 1) Die Werte, die für Faltungen von Bedeutung sind, sind 2. und 3. und sie repräsentieren die Überlappung bei der Anwendung der Faltungsfilter entlang Zeilen und Spalten. Der Wert von [1, 2, 2, 1] besagt, dass die Filter auf jede zweite Zeile und Spalte angewendet werden sollen.

Re 2) Ich kenne die technischen Einschränkungen nicht (möglicherweise CuDNN-Anforderungen), aber normalerweise verwenden die Benutzer Schritte entlang der Zeilen- oder Spaltenabmessungen. Es ist nicht unbedingt sinnvoll, dies über die Chargengröße hinaus zu tun. Ich bin mir der letzten Dimension nicht sicher.

Re 3) Die Einstellung -1 für eine der Bemaßungen bedeutet "Setze den Wert für die erste Bemaßung so, dass die Gesamtzahl der Elemente im Tensor unverändert bleibt". In unserem Fall ist -1 gleich batch_size.

16

Beginnen wir mit dem, was Schritt für Schritt macht.

Nehmen wir an, Ihr input = [1, 0, 2, 3, 0, 1, 1] und kernel = [2, 1, 3] das Ergebnis der Faltung ist [8, 11, 7, 9, 4], das berechnet wird, indem Sie Ihren Kernel über die Eingabe schieben, eine elementweise Multiplikation durchführen und alles summieren. Gefällt mir :

  • 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

Hier gleiten wir um ein Element, aber nichts hält Sie davon ab, eine andere Zahl zu verwenden. Diese Zahl ist Ihr Schritt. Sie können sich das Ergebnis der 1-stufigen Faltung als Downsampling vorstellen, indem Sie einfach jedes s-te Ergebnis nehmen.

Kenntnis der Eingabegröße i , Kernelgröße k , Schrittweite s und padding p können Sie leicht die Ausgabegröße der Faltung berechnen als:

enter image description here

Hier || Betreiber bedeutet Deckenbetrieb. Für eine Poolschicht ist s = 1.


N-dim case.

Wenn Sie die Mathematik für einen 1-dim-Fall kennen, ist der n-dim-Fall einfach, wenn Sie sehen, dass jedes Dim unabhängig ist. Sie schieben also jede Dimension einzeln. Hier ist ein Beispiel für 2-d . Beachten Sie, dass Sie nicht in allen Dimensionen den gleichen Schritt ausführen müssen. Für eine N-dim-Eingabe/einen Kernel sollten Sie also N Schritte bereitstellen.


So ist es jetzt einfach, alle Ihre Fragen zu beantworten:

  1. Was bedeuten die 4+ ganzen Zahlen? . conv2d , pool gibt an, dass diese Liste die Schritte zwischen den einzelnen Dimensionen darstellt. Beachten Sie, dass die Länge der Strides-Liste dem Rang des Kernel-Tensors entspricht.
  2. Warum müssen sie Schritte [0] = Schritte = 1 für Convnets haben? . Die erste Dimension ist die Losgröße, die letzte Dimension sind Kanäle. Es gibt keinen Grund, weder Stapel noch Kanal zu überspringen. Also machst du sie 1. Für Breite/Höhe kannst du etwas überspringen und deshalb könnten sie nicht 1 sein.
  3. tf.reshape (_X, shape = [- 1, 28, 28, 1]). Warum -1? tf.reshape hat es für Sie abgedeckt:

    Wenn eine Formkomponente der Spezialwert -1 ist, wird die Größe dieser Dimension so berechnet, dass die Gesamtgröße konstant bleibt. Insbesondere wird eine Form von [-1] zu 1-D abgeflacht. Höchstens eine Formkomponente kann -1 sein.

10
Salvador Dali

@dga hat wundervolle Arbeit geleistet und ich kann nicht genug dankbar sein, wie hilfreich es war. In ähnlicher Weise möchte ich meine Erkenntnisse darüber mitteilen, wie stride in der 3D-Faltung funktioniert.

Gemäß der TensorFlow-Dokumentation auf conv3d muss die Form der Eingabe in der folgenden Reihenfolge vorliegen:

[batch, in_depth, in_height, in_width, in_channels]

Lassen Sie uns die Variablen von rechts nach links an einem Beispiel erläutern. Angenommen, die Eingabeform ist 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.

Nachfolgend finden Sie eine zusammenfassende Dokumentation zur Verwendung von stride.

schritte: Eine Liste von Ints mit einer Länge> = 5. 1-D-Tensor der Länge 5. Der Schritt des Schiebefensters für jede Eingabedimension. Haben müssen strides[0] = strides[4] = 1

Wie in vielen Arbeiten angegeben, bedeuten Schritte einfach, wie viele Schritte ein Fenster oder ein Kernel vom nächsten Element entfernt ist, sei es ein Datenrahmen oder ein Pixel (dies wird übrigens umschrieben).

Aus der obigen Dokumentation geht hervor, dass ein Schritt in 3D so aussieht: = (1, [~ # ~] x [~ # ~] , [~ # ~] y [~ # ~] , [~ # ~] z [~ # ~] , 1).

Die Dokumentation betont, dass 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 

schritte [X] bedeutet, wie viele Sprünge wir in den konzentrierten Frames machen sollen. Wenn wir zum Beispiel 16 Frames haben, bedeutet X = 1, dass jeder Frame verwendet wird. X = 2 bedeutet, dass jeder zweite Frame verwendet wird und es geht und weiter

schritte [y] und Schritte [z] folgen der Erklärung durch @ dga , daher werde ich diesen Teil nicht wiederholen.

In Keras müssen Sie jedoch nur einen Tupel/eine Liste mit 3 Ganzzahlen angeben, wobei Sie die Schritte der Faltung entlang jeder räumlichen Dimension angeben, wobei die räumliche Dimension Schritt [x], Schritte [y] und Schritte [z] ist. strides [0] und strides [4] sind bereits auf 1 voreingestellt.

Ich hoffe, jemand findet das hilfreich!

2
rocksyne