Implementierung von im2col in TensorFlow

9

Ich möchte eine Operation ähnlich der 2D-Faltung in TensorFlow implementieren. Nach meinem Verständnis ist der häufigste Ansatz zum Implementieren von Faltung, indem zuerst eine Operation im2col auf das Bild angewendet wird (siehe hier) - Unterabschnitt " Implementierung als Matrixmultiplikation ") - eine Operation, die ein Bild in eine 2D-Matrix mit einzelnen "Chunks" des Bildes umwandelt, auf die der Kernel als abgeflachte Spalten angewendet wird.

Mit anderen Worten, dieser Auszug aus der oben verlinkten Ressource erklärt, was im2col gut macht:

  

[...] Zum Beispiel, wenn die Eingabe ist [227x227x3] (im Format Höhe x Breite x n_channels) und es mit 11x11x3 Filter bei Schritt 4 gefaltet werden soll, dann wir würde [11x11x3] Blöcke von Pixeln in der Eingabe nehmen und jeden Block in einen Spaltenvektor der Größe 11 * 11 * 3 = 363 strecken. Wenn dieser Prozess in der Eingabe bei Schritt 4 durchgeführt wird, ergibt sich (227-11) / 4 + 1 = 55 Positionen entlang der Breite und Höhe, was zu einer Ausgangsmatrix X_col von im2col der Größe [363 x 3025] führt, wobei jede Spalte ein ausgedehntes rezeptives Feld ist und es 55 * 55 = 3025 von ihnen insgesamt gibt. Beachten Sie, dass, da sich die rezeptiven Felder überlappen, jede Zahl im Eingabe-Volume in mehreren unterschiedlichen Spalten dupliziert werden kann.

Wie ich aus den TensorFlow-Dokumenten verstehe, wird das intern mit tf.nn.conv2d gemacht. auch.

Nun möchte ich die Operation im2col in TensorFlow separat implementieren (da ich Zugriff auf dieses Zwischenergebnis haben möchte). Da das Kopieren von Werten auf eine nicht-triviale Art und Weise beinhaltet ist, wie würde ich ein relativ effizientes Berechnungsdiagramm für diese Operation selbst erstellen? Ähnlich, wie würde man die umgekehrte Operation implementieren?

    
Bruno K. Mlodozeniec 07.08.2017, 18:56
quelle

1 Antwort

2

Sie können dies einfach mit extract_image_patches durchführen.

Diese Funktion setzt jedes filter_size x filter_size -Patch des Bildes in die Tiefe, was einen [batch_size, height, width, 9] Tensor ergibt.

Um mit tf.nn.conv2d zu vergleichen, können Sie den Sobel-Operator für Bilder implementieren

%Vor%

Dies gibt 0.0 , da sie äquivalent sind. Dies benötigt keine Umkehrfunktion.

Bearbeiten :

  

Wie ich von den TensorFlow-Dokumenten verstehe, ist das getan   intern auch mit tf.nn.conv2d.

Nein, nicht wirklich. TF auf der GPU zum Beispiel stützen sich auf CuDNN, das ein Komplex ist Biest (Winograd, Ptx, ...). Nur unter bestimmten Umständen verwendet es den im2col -Ansatz wie hier auf CPU und die quantisierte Version hier .

    
Patwie 29.01.2018, 20:38
quelle