Die Pooling- und Faltungsoperationen schieben ein "Fenster" über den Eingangstensor. Die Verwendung tf.nn.conv2d
als Beispiel: Wenn der Eingang Tensor 4 Dimensionen hat: [batch, height, width, channels]
, dann arbeitet die Faltung auf einem 2D - Fenstern auf den height, width
Dimensionen.
strides
bestimmt, 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.
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.
quelle
Beginnen wir mit dem, was der Schritt im 1-Dim-Fall macht.
Nehmen wir an, Sie
input = [1, 0, 2, 3, 0, 1, 1]
undkernel = [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 :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:
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:
quelle
@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
stride
die 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]
Unten finden Sie eine zusammenfassende Dokumentation zur Verwendung von Schritt.
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
.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!
quelle