Ich verstehe, dass die Faltungsschicht eines neuronalen Faltungsnetzwerks vier Dimensionen hat: Eingabekanäle, Filterhöhe, Filterbreite, Anzahl der Filter. Ich verstehe außerdem, dass jeder neue Filter nur über ALLE input_channels (oder Feature- / Aktivierungskarten aus der vorherigen Ebene) gefaltet wird.
Die folgende Grafik aus CS231 zeigt jedoch, dass jeder Filter (in Rot) auf einen EINKANAL angewendet wird, anstatt dass derselbe Filter für alle Kanäle verwendet wird. Dies scheint darauf hinzudeuten, dass es einen separaten Filter für JEDEN Kanal gibt (in diesem Fall gehe ich davon aus, dass es sich um die drei Farbkanäle eines Eingabebildes handelt, aber dasselbe gilt für alle Eingabekanäle).
Dies ist verwirrend - gibt es für jeden Eingangskanal einen anderen eindeutigen Filter?
Quelle: http://cs231n.github.io/convolutional-networks/
Das obige Bild scheint einem Auszug aus O'reillys "Fundamentals of Deep Learning" zu widersprechen :
"... Filter funktionieren nicht nur auf einer einzelnen Feature-Map. Sie funktionieren auf dem gesamten Volumen von Feature-Maps, die auf einem bestimmten Layer generiert wurden ... Aus diesem Grund müssen Feature-Maps in der Lage sein, über Volumes hinweg zu funktionieren. nicht nur Gebiete "
... Ich verstehe auch, dass diese Bilder darauf hinweisen, dass der gleiche Filter nur über alle drei Eingangskanäle verteilt ist (im Widerspruch zu dem, was in der obigen CS231-Grafik gezeigt wird):
Antworten:
Das Vorherige. Tatsächlich ist für jede Kombination aus Eingangskanal und Ausgangskanal ein separater Kernel definiert.
Typischerweise gibt es für eine CNN-Architektur in einem einzelnen Filter, wie von Ihrem
number_of_filters
Parameter beschrieben, einen 2D-Kernel pro Eingangskanal. Es gibtinput_channels * number_of_filters
Mengen von Gewichten, von denen jede einen Faltungskern beschreibt. Die Diagramme, die einen Satz von Gewichten pro Eingangskanal für jeden Filter zeigen, sind also korrekt. Das erste Diagramm zeigt auch deutlich, dass die Ergebnisse des Anwendens dieser Kernel kombiniert werden, indem sie aufsummiert und für jeden Ausgangskanal eine Vorspannung hinzugefügt wird.Dies kann auch als 3D-Faltung für jeden Ausgangskanal angesehen werden, der zufällig die gleiche Tiefe wie der Eingang hat. Welches ist, was Ihr zweites Diagramm zeigt, und was viele Bibliotheken intern tun werden. Mathematisch ist dies dasselbe Ergebnis (vorausgesetzt, die Tiefen stimmen genau überein), obwohl der Layertyp normalerweise als "Conv2D" oder ähnlich bezeichnet wird. Wenn Ihr Eingabetyp von Natur aus 3D ist, wie z. B. Voxel oder ein Video, können Sie auch eine "Conv3D" -Ebene verwenden. Intern kann diese jedoch auch als 4D-Faltung implementiert werden.
quelle
input_channels
Versionen mit unterschiedlichen Gewichten . Haben Sie eine "offizielle" Quelle, die dieses Verständnis bestätigt?Das folgende Bild, das Sie in Ihrer Frage verwendet haben, beschreibt sehr genau, was passiert. Denken Sie daran, dass jedes Element des 3D-Filters (grauer Würfel) aus einem anderen Wert (
3x3x3=27
Werten) besteht. So werden drei verschiedene 2D - Filter der Größe3x3
können verkettet werden , diese zu bilden 3D - Filter der Größe3x3x3
.Der
3x3x3
RGB-Teil des Bildes wird mit einem 3D-Filter (grau dargestellt) elementweise multipliziert . In diesem Fall hat der Filter Gewichte. Wenn diese Gewichte elementweise multipliziert und dann summiert werden, ergibt dies einen Wert.3x3x3=27
Gibt es für jeden Eingangskanal einen eigenen Filter?
JA , es gibt so viele 2D-Filter wie Eingangskanäle im Bild. Es ist jedoch hilfreich, wenn Sie der Meinung sind, dass es für Eingangsmatrizen mit mehr als einem Kanal nur einen 3D-Filter gibt (siehe Abbildung oben).
Warum heißt das dann 2D-Faltung (wenn Filter 3D ist und Eingabematrix 3D ist)?
Dies ist eine 2D-Faltung, da sich die Schritte des Filters nur entlang der Höhen- und Breitendimensionen ( NICHT der Tiefe) befinden und daher die Ausgabe, die durch diese Faltung erzeugt wird, auch eine 2D-Matrix ist. Die Anzahl der Bewegungsrichtungen des Filters bestimmt die Abmessungen der Faltung.
Hinweis: Wenn Sie Ihr Verständnis verbessern, indem Sie einen einzelnen 3D-Filter anstelle mehrerer 2D-Filter (einen für jede Ebene) anzeigen, können Sie erweiterte CNN-Architekturen wie Resnet, InceptionV3 usw. problemlos verstehen.
quelle
input_channels
Versionen mit unterschiedlichen Gewichten. Wenn dies auch Ihr Verständnis ist, gibt es eine "offizielle" Quelle, die dies bestätigt?Ich verfolge die obigen Antworten mit einem konkreten Beispiel, um die Funktionsweise der Faltung in Bezug auf die Eingabe- und Ausgabekanäle bzw. die Gewichte näher zu erläutern:
Das Beispiel sei wie folgt (bezogen auf 1 Faltungsschicht):
input_channels=5
output_channels=56
Wir notieren das:
Diese Faltungsschicht enthält somit:
56 3-dimensionale Filter der Größe 4x4x5 (= jeweils 80 verschiedene Gewichte), um die 56 Ausgangskanäle zu berücksichtigen, wobei jeder einen Wert für die 3. Dimension von 5 hat, der mit den 5 Eingangskanälen übereinstimmt. Insgesamt gibt es
number_of_filters=input_channel*output_channels=5*56=280
2D-Filter der Größe 4x4 (dh insgesamt 280x16 verschiedene Gewichte).
quelle
Es gibt nur Einschränkungen in 2D. Warum?
Stellen Sie sich eine vollständig verbundene Ebene vor.
Es wäre furchtbar groß, jedes Neuron würde mit vielleicht 1000x1000x3 Eingangsneuronen verbunden sein. Wir wissen jedoch, dass die Verarbeitung von Pixeln in der Nähe sinnvoll ist, daher beschränken wir uns auf eine kleine 2D-Nachbarschaft, sodass jedes Neuron in 2D nur mit 3x3-Neuronen in der Nähe verbunden ist. Wir kennen uns mit Kanälen nicht aus und stellen daher eine Verbindung zu allen Kanälen her.
Trotzdem würde es zu viele Gewichte geben. Aufgrund der Übersetzungsinvarianz ist ein Filter, der in einem Bereich gut funktioniert, höchstwahrscheinlich in einem anderen Bereich nützlich. Wir verwenden also die gleichen Gewichte in 2D. Auch hier gibt es keine solche Übersetzungsinvarianz zwischen den Kanälen, daher gibt es dort keine solche Einschränkung.
quelle
Siehe Abschnitt "Lokale Konnektivität" in http://cs231n.github.io/convolutional-networks/ und Folie 7-18.
Der Hyperparameter "Empfangsfeld" des Filters wird nur durch Höhe und Breite definiert, da die Tiefe durch die Tiefe der vorhergehenden Ebene festgelegt wird.
HINWEIS: "Das Ausmaß der Konnektivität entlang der Tiefenachse ist immer gleich der TIEFE des Eingabevolumens" - oder - TIEFE der Aktivierungskarte (bei späteren Ebenen).
Dies muss intuitiv darauf zurückzuführen sein, dass Bildkanaldaten verschachtelt und nicht planar sind. Auf diese Weise kann das Anwenden eines Filters einfach durch Multiplikation von Spaltenvektoren erreicht werden.
HINWEIS: Convolutional Network lernt alle Filterparameter (einschließlich der Tiefendimension) und sie sind insgesamt "h w input_layer_depth + 1 (bias)".
quelle
Als Antwort empfehle ich Kapitel 2.2.1 meiner Masterarbeit . So ergänzen Sie die verbleibenden Antworten:
Keras ist dein Freund, der versteht, was passiert:
gibt
Versuchen Sie, Ihre Optionen zu formulieren. Was würde das für die Parameter bedeuten, wenn etwas anderes der Fall wäre?
Hinweis:2400 = 32 ⋅ ( 3 ⋅ 5 ⋅ 5 )
Dieser Ansatz hilft Ihnen auch bei anderen Ebenentypen, nicht nur bei Faltungsebenen.
Bitte beachten Sie auch, dass Sie andere Lösungen implementieren können, die möglicherweise eine andere Anzahl von Parametern haben.
quelle
Nur um zwei Details klar zu machen:
Sagen Sie, Sie habenN 2D-Eingangskanäle gehen auf N 2D-Ausgabekanäle. Die Gesamtzahl von 2D3 × 3 Filtergewichte sind eigentlich N2 . Aber wie wird die 3D-Faltung beeinflusst, dh wenn jeder Eingangskanal eine 2D-Ebene zu jedem Ausgangskanal beiträgt, besteht jeder Ausgangskanal zunächst ausN 2D-Ebenen, wie werden sie kombiniert?
Dies wird in fast jeder Veröffentlichung, die ich gesehen habe, beschönigt, aber das Schlüsselkonzept ist dasN2 2D-Ausgabekanäle werden miteinander verschachtelt, um die zu bilden N Ausgangskanäle, wie gemischte Kartendecks, bevor sie summiert werden. Dies ist alles logisch, wenn Sie feststellen, dass Sie entlang der Kanaldimensionen einer Faltung (die nie dargestellt wird) tatsächlich eine vollständig verbundene Ebene haben! Jeder 2D-Eingangskanal wird mit einem eindeutigen multipliziert3 × 3 Filter, liefert einen 2D-Ausgabeschichtbeitrag für einen einzelnen Ausgabekanal. Einmal kombiniert, ist jede Ausgabeebene eine Kombination jeder Eingabeebene× ein einzigartiger Filter. Es ist ein All-in-All-Beitrag.
Am einfachsten können Sie sich davon überzeugen, indem Sie sich vorstellen, was in anderen Szenarien passiert, und feststellen, dass die Berechnung degeneriert. Wenn Sie also die Ergebnisse nicht verschachteln und neu kombinieren, würden die verschiedenen Ausgaben tatsächlich nichts bewirken hätte den gleichen Effekt wie eine einzelne Ausgabe mit kombinierten Gewichten.
quelle
Für alle, die verstehen möchten, wie Windungen berechnet werden, ist hier ein nützlicher Codeausschnitt in Pytorch:
Wenn Sie dies ausführen, erhalten Sie die folgende Ausgabe:
Beachten Sie, wie sich jeder Kanal der Faltung über alle vorherigen Kanalausgaben summiert.
quelle