Wie sind 1x1-Faltungen mit einer vollständig verbundenen Ebene identisch?

55

Ich habe kürzlich den Kommentar von Yan LeCuns zu 1x1-Windungen gelesen :

In Convolutional Nets gibt es keine "vollständig verbundenen Schichten". Es gibt nur Faltungsschichten mit 1x1-Faltungskernen und einer vollständigen Verbindungstabelle.

Es ist eine zu selten verstandene Tatsache, dass ConvNets keine Eingabe mit fester Größe benötigen. Sie können sie auf Eingaben trainieren, die zufällig einen einzelnen Ausgabevektor (ohne räumliche Ausdehnung) erzeugen, und sie dann auf größere Bilder anwenden. Anstelle eines einzelnen Ausgabevektors erhalten Sie dann eine räumliche Karte der Ausgabevektoren. Jeder Vektor sieht Eingabefenster an verschiedenen Stellen der Eingabe. In diesem Szenario wirken die "vollständig verbundenen Schichten" tatsächlich als 1x1-Faltungen.

Ich würde gerne ein einfaches Beispiel dafür sehen.

Beispiel

Angenommen, Sie haben ein vollständig verbundenes Netzwerk. Es hat nur eine Eingabeebene und eine Ausgabeebene. Die Eingabeebene hat 3 Knoten, die Ausgabeebene hat 2 Knoten. Dieses Netzwerk hat 32=6 Parameter. Nehmen wir an, Sie haben eine ReLU-Aktivierungsfunktion in der Ausgabeebene und in der Gewichtsmatrix, um sie noch konkreter zu machen

W=(011235)R2×3b=(813)R2

Das Netzwerk ist also f(X)=ReLU(WX+b) mit XR3 .

Wie müsste die Faltungsschicht aussehen, um gleich zu sein? Was bedeutet LeCun mit "vollständiger Verbindungstabelle"?

Ich denke, um eine äquivalente CNN zu erhalten, müsste es genau die gleiche Anzahl von Parametern haben. Der MLP von oben hat 23+2=8 Parameter.

Martin Thoma
quelle

Antworten:

29

Dein Beispiel

In Ihrem Beispiel haben wir 3 Eingabe- und 2 Ausgabeeinheiten. Um Faltungen gelten, denken Sie an diesen Einheiten Form aufweist: [1,1,3]und [1,1,2], respectively. In CNN-Begriffen haben wir 3Eingabe- und 2Ausgabe-Feature-Maps, die jeweils räumliche Dimensionen haben 1 x 1.

Wenn Sie einer n x nEbene mit kFeature-Maps eine Faltung zuweisen möchten , benötigen Sie einen Formkern [n,n,k]. Daher hat der Kern von euch 1x1Windungen eine Form [1, 1, 3]. Sie benötigen 2diese Kernel (oder Filter), um die 2Ausgabe-Feature-Maps zu erstellen. Bitte beachten Sie: Faltungen entsprechen tatsächlich 1 × 1 × der Kanalanzahl der Eingangsfaltungen . Der letzte wird nur selten erwähnt.1×11×1×Anzahl der Kanäle des Eingangs

In der Tat, wenn Sie als Kernel und Bias wählen:

w1=(011)R3w2=(235)R3b=(813)R2

Die CONV-Schicht wird dann berechnen , mit x R 3 .f(X)=ReLU((w1Xw2X)+(b1b2))XR3

Transformation in echten Code

Schauen Sie sich für ein reales Beispiel auch meine vgg-fcn- Implementierung an. Der in dieser Datei bereitgestellte Code nimmt die VGG-Gewichte auf, wandelt jedoch jede vollständig verbundene Ebene in eine Faltungsebene um. Das resultierende Netzwerk liefert die gleiche Ausgabe wie vggbeim Anwenden auf das Eingabebild der Form [244,244,3]. (Wenn beide Netzwerke ohne Auffüllen angewendet werden).

Die transformierten Faltungsschichten werden in die Funktion eingeführt _fc_layer(Zeile 145). Sie haben eine 7x7Kernelgröße für FC6 (die maximal ist, ab pool5VGG gibt eine Feature Map Form aus [7,7, 512]. Layer FC7und FC8werden als 1x1Faltung implementiert .

"Vollständige Verbindungstabelle"

Ich bin nicht zu 100% sicher, aber er könnte sich auf einen Filter / Kernel beziehen, der die gleiche Dimension wie die Eingabe-Feature-Map hat. In beiden Fällen (Code und Ihr Beispiel) sind die räumlichen Dimensionen maximal in dem Sinne, dass die räumliche Dimension des Filters der räumlichen Dimension als Eingabe entspricht.

MarvMind
quelle
"Daher hat der Kernel von euch 1x1-Windungen die Form [1, 1, 3]." Was? Es scheint ein größeres Missverständnis der Windungen zu geben. Ich dachte, wenn ein Faltungskern die Form [1, 1, 3] hat, würde man dann sagen, es ist eine 1x1x3-Faltung? Also geht es bei 1x1-Faltung nur um die Ausgabe, nicht um den Kernel?
Martin Thoma
2
Stimmen Sie mir kernel = filterzu? >> „So ist 1x1 Faltung nur über den Ausgang, nicht über den Kernel? Gar nicht. Eine 3x3Faltung eine beliebige Ausgabeform haben kann.“ In der Tat, wenn Polsterung verwendet wird , und stride=1dann das output shape = input shape. >> "Ich dachte, wenn ein Faltungskern die Form [1, 1, 3] hat, würde man sagen, es ist eine 1x1x3-Faltung?" Nein, ich habe noch nie jemanden über 3x3x512Windungen sprechen hören . Alle Faltungsfilter, die ich gesehen habe, haben jedoch eine dritte räumliche Dimension, die der Anzahl der Merkmalskarten der Eingabeebene entspricht.
MarvMind
Schauen Sie sich als Referenz den Convolution DemoKurs von Karpathies CS321n an: cs231n.github.io/convolutional-networks/#conv . Oder an der tensorflow API: tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d Filter sollen eine Form haben [filter_height, filter_width, in_channels, out_channels].
MarvMind
Darf ich die Sache mit "1x1 Faltungen sind 1 x 1 x Anzahl der Kanäle des Eingangs" zu Ihrer Antwort hinzufügen? Dies war die Quelle meiner Verwirrung und ich vergesse dies immer wieder.
Martin Thoma
Sicher, gehen Sie vor!
MarvMind
4

nnichmnnm

nnichm

nnichm

nnichm

( Quelle )

Michael Yahalom
quelle
1
n=1
2

Der äquivalente Kernel hat einfach die Form der Eingabe und berechnet ein Tensor-Skalarprodukt. (Ich verwende das Wort "Form", da es bei "Größe" Verwirrung zu geben scheint, wobei die Dimension "Kanal / Tiefe" häufig ignoriert wird.) Es ist kein "Verschieben des Kernels über die Eingabe" beteiligt, da der Kernel so groß ist, wie er sein kann. Zitieren von Stanford CS 231n Kursnotizen :

Jeder FC-Layer kann in einen CONV-Layer konvertiert werden. Beispielsweise kann eine FC-Schicht mit K = 4096, die ein Eingangsvolumen der Größe 7 × 7 × 512 betrachtet, äquivalent als CONV-Schicht mit F = 7, P = 0, S = 1, K = 4096, F ausgedrückt werden = 7, P = 0, S = 1, K = 4096. Mit anderen Worten, wir setzen die Filtergröße genau auf die Größe des Eingabevolumens und daher wird die Ausgabe einfach 1 × 1 × 4096 sein, da nur eine einzige Tiefenspalte über das Eingabevolumen „passt“ und das gleiche Ergebnis ergibt wie die anfängliche FC-Schicht.

Ich glaube, "F = 7, P = 0, S = 1, K = 4096, F = 7, P = 0, S = 1, K = 4096" bedeutet hier, dass jeder Konvektionskern die Form 7x7x512 hat, und es gibt 4096 solcher Filter.

In der vorherigen Antwort wurde erwähnt, dass die letzte fc von AlexNet (die Eingaben mit der Form 1x1x4096 empfängt und 1000 Klassenwerte berechnet) als "1x1-Faltung" implementiert ist. Um vollständig zu sein, hat jeder solche Conv-Kernel die Form 1x1x4096, und es gibt 1000 davon.

Le Cunn erklärt dies auch in der CNN-Veröffentlichung , Seite 8, Beschreibung von LeNet5:

Layer C5 ist ein Faltungslayer mit 120 Feature-Maps. Jede Einheit ist auf allen 16 Funktionskarten von S4 mit einem 5x5-Viertel verbunden. Da die Größe von S4 ebenfalls 5 x 5 beträgt, beträgt die Größe der Feature-Maps von C5 1 x 1. Dies entspricht einer vollständigen Verbindung zwischen S4 und C5.

Yibo Yang
quelle
1

Für jeden Neuling PyTorch Benutzer wie ich - nicht zu verwechseln „vollständig verbundene Schicht“ mit einer „linearen Schicht“.

Eine lineare Ebene und 1x1-Windungen sind dasselbe. Ich habe eine Weile gebraucht, um zu verstehen, dass es keine "vollständig verbundene Schicht" gibt - es ist einfach eine Abflachung der räumlichen Dimensionen zu einem 1D-Riesentensor. Durch das Reduzieren wird jedes Element an allen räumlichen Standorten als separate Feature-Map / Kanal / Dimension dargestellt (wie auch immer Sie es nennen möchten). Wenn wir also eine lineare Schicht auf einen abgeflachten Tensor aufbringen , erhalten wir eine vollständig verbundene Operation, die offensichtlich nicht mit einer 1x1-Faltung identisch ist.

1x1j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

O=W2×3X3×1+b2×1

Andere Antworten, die behaupten, eine vollständig verbundene Ebene sei einfach eine gültige nxn Faltungsebene für eine Größeneingabe, nxnsind verwirrend (wenn auch richtig).

Rakshit Kothari
quelle