Tensorflow schreitet Argument


115

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

Die Dokumentation sagt wiederholt

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

Meine Fragen sind:

  1. Was bedeutet jede der 4+ Ganzzahlen?
  2. Warum müssen sie für Convnets Schritte [0] = Schritte [3] = 1 haben?
  3. In diesem Beispiel sehen wir tf.reshape(_X,shape=[-1, 28, 28, 1]). Warum -1?

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

Antworten:


224

Die Pooling- und Faltungsoperationen schieben ein "Fenster" über den Eingangstensor. Die Verwendung tf.nn.conv2dals Beispiel: Wenn der Eingang Tensor 4 Dimensionen hat: [batch, height, width, channels], dann arbeitet die Faltung auf einem 2D - Fenstern auf den height, widthDimensionen.

stridesbestimmt, um wie viel sich das Fenster in jeder der Dimensionen verschiebt. 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 2D-Faltung über ein 32 x 32-Graustufen-Eingabebild. Ich sage Graustufen, weil das Eingabebild dann Tiefe = 1 hat, was hilft, es einfach zu halten. Lassen Sie 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 ausführen (Stapelgröße = 1). Wir geben der Faltung eine Ausgangskanaltiefe von 8.

Die Eingabe zur Faltung hat shape=[1, 32, 32, 1].

Wenn Sie angeben , strides=[1,1,1,1]mit padding=SAME, dann wird der Ausgang 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 Zeile 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 überlappenden Fenster ausgeführt. Es wird berechnet:

F(00, 01
  10, 11)

und dann

F(02, 03
  12, 13)

Der Schritt funktioniert für die Pooling-Betreiber ähnlich.

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 aufnehmen 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, so dass Sie könnte Faltungen, die das Fenster entlang anderen Dimensionen schieben zu schaffen, aber das ist kein typischer Einsatz in convnets. Die typische Verwendung besteht darin, sie räumlich zu verwenden.

Warum die Umformung auf -1 -1 erfolgt, ist ein Platzhalter mit der Aufschrift "Nach Bedarf anpassen, um die für den vollen Tensor erforderliche Größe anzupassen". Auf diese Weise wird der Code unabhängig von der eingegebenen Stapelgröße, sodass Sie Ihre Pipeline ändern können und die Stapelgröße nicht überall im Code anpassen müssen.


5
@derek weil (aus dem Text) "Wir geben der Faltung eine Ausgangskanaltiefe von 8.". Es ist etwas, das Sie auswählen können, wenn Sie die Faltung einrichten, und der Antwortende hat 8.
etarion

17

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 Anwenden von Operationen. Im Fall von conv2d wird der Abstand zwischen aufeinanderfolgenden Anwendungen von Faltungsfiltern angegeben. Der Wert 1 in einer bestimmten Dimension bedeutet, dass wir den Operator auf jede Zeile / Spalte anwenden, der Wert 2 bedeutet jede Sekunde und so weiter.

Zu 1) Die Werte, die für Faltungen wichtig sind, sind 2. und 3. und sie repräsentieren die Überlappung bei der Anwendung der Faltungsfilter entlang von Zeilen und Spalten. Der Wert von [1, 2, 2, 1] besagt, dass wir die Filter auf jede zweite Zeile und Spalte anwenden möchten.

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

Zu 3) Wenn Sie -1 für eine der Dimensionen festlegen, bedeutet dies, dass Sie den Wert für die erste Dimension so einstellen, dass die Gesamtzahl der Elemente im Tensor unverändert bleibt. In unserem Fall ist -1 gleich batch_size.


11

Beginnen wir mit dem, was der Schritt im 1-Dim-Fall macht.

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

  • 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 an einem Element vorbei, aber nichts hält Sie davon ab, eine andere Zahl zu verwenden. Diese Nummer ist Ihr Schritt. Sie können sich das als Downsampling des Ergebnisses der 1-Schritt-Faltung vorstellen, indem Sie einfach jedes s-te Ergebnis nehmen.

Wenn Sie die Eingabegröße i , die Kerngröße k , die Schritte s und den Abstand p kennen , können Sie die Ausgabegröße der Faltung einfach wie folgt berechnen:

Geben Sie hier die Bildbeschreibung ein

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


N-dim Fall.

Wenn Sie die Mathematik für einen 1-Dim-Fall kennen, ist der n-Dim-Fall einfach, sobald 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 machen müssen. Für einen N-dim-Eingang / Kernel sollten Sie also N Schritte bereitstellen.


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

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

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


2

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

Gemäß der TensorFlow-Dokumentation zu conv3d muss die Form der Eingabe in dieser Reihenfolge sein:

[batch, in_depth, in_height, in_width, in_channels]

Lassen Sie uns die Variablen von ganz rechts nach links anhand eines Beispiels erklären. 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.

Unten finden Sie eine zusammenfassende Dokumentation zur Verwendung von Schritt.

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

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

Aus der obigen Dokumentation geht hervor, dass ein Schritt in 3D wie folgt aussieht: (1, X , Y , Z , 1).

Die Dokumentation betont dies 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, jeden zweiten Frame zu verwenden und es geht weiter und weiter

Die Schritte [y] und [z] folgen der Erklärung von @dga, sodass ich diesen Teil nicht wiederholen werde.

In Keras müssen Sie jedoch nur ein 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], Schritt [y] und Schritt [z] ist. Schritte [0] und Schritte [4] sind bereits standardmäßig auf 1 eingestellt.

Ich hoffe jemand findet das hilfreich!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.