Das folgende Beispiel stammt aus den Vorlesungen in deeplearning.ai zeigt, dass das Ergebnis die Summe des Element-für-Element-Produkts (oder der "elementweisen Multiplikation") ist. Die roten Zahlen stehen für die Gewichte im Filter:
Die meisten Ressourcen sagen jedoch, dass das Punktprodukt verwendet wird:
"... wir können die Ausgabe des Neurons erneut ausdrücken als, wo ist der Bias-Term. Mit anderen Worten, wir können die Ausgabe durch y = f (x * w) berechnen, wobei b der Bias-Term ist. Mit anderen Worten, wir kann die Ausgabe berechnen, indem das Punktprodukt der Eingabe- und Gewichtsvektoren ausgeführt wird, der Bias-Term hinzugefügt wird, um das Logit zu erzeugen, und dann die Transformationsfunktion angewendet wird. "
Buduma, Nikhil; Locascio, Nicholas. Grundlagen des Deep Learning: Entwerfen von Machine Intelligence-Algorithmen der nächsten Generation (S. 8). O'Reilly Media. Kindle Edition.
"Wir nehmen den 5 * 5 * 3-Filter und schieben ihn über das gesamte Bild und nehmen dabei das Punktprodukt zwischen Filter und Blöcken des Eingabebildes. Für jedes aufgenommene Punktprodukt ist das Ergebnis ein Skalar."
"Jedes Neuron empfängt einige Eingaben, führt ein Punktprodukt aus und folgt ihm optional mit einer Nichtlinearität."
http://cs231n.github.io/convolutional-networks/
"Das Ergebnis einer Faltung entspricht jetzt der Durchführung einer großen Matrixmultiplikation np.dot (W_row, X_col), die das Punktprodukt zwischen jedem Filter und jedem Empfangsfeldort auswertet."
http://cs231n.github.io/convolutional-networks/
Wenn ich jedoch nachforsche , wie das Punktprodukt von Matriken berechnet wird , scheint es, dass das Punktprodukt nicht mit der Summierung der Element-für-Element-Multiplikation identisch ist. Welche Operation wird tatsächlich verwendet (Element-für-Element-Multiplikation oder das Punktprodukt?) Und was ist der Hauptunterschied?
quelle
Hadamard product
dem ausgewählten Bereich und dem Faltungskern.Antworten:
Jede gegebene Ebene in einem CNN hat normalerweise 3 Dimensionen (wir nennen sie Höhe, Breite, Tiefe). Die Faltung erzeugt eine neue Schicht mit einer neuen (oder gleichen) Höhe, Breite und Tiefe. Die Operation wird jedoch in Bezug auf Höhe / Breite und Tiefe unterschiedlich ausgeführt, und dies ist meiner Meinung nach verwirrend.
Lassen Sie uns zunächst sehen, wie sich die Faltungsoperation auf die Höhe und Breite der Eingabematrix auswirkt. Dieser Fall wird genau wie in Ihrem Bild dargestellt ausgeführt und ist mit Sicherheit eine elementweise Multiplikation der beiden Matrizen .
Theoretisch :
Zweidimensionale (diskrete) Faltungen werden nach folgender Formel berechnet:
Wie Sie sehen können, wird jedes Element von als die Summe der Produkte eines einzelnen Elements von mit einem einzelnen Element von berechnet . Dies bedeutet, dass jedes Element von aus der Summe der elementweisen Multiplikation von und berechnet wird .C A B C A B
In der Praxis :
Sie können das obige Beispiel mit einer beliebigen Anzahl von Paketen testen (ich verwende scipy ):
Der obige Code erzeugt:
Nun kann die Faltungsoperation für die Tiefe der Eingabe tatsächlich als Punktprodukt betrachtet werden, da jedes Element derselben Höhe / Breite mit demselben Gewicht multipliziert und sie summiert werden. Dies ist am deutlichsten bei 1x1-Windungen (normalerweise verwendet, um die Tiefe einer Ebene zu ändern, ohne ihre Abmessungen zu ändern). Dies ist jedoch nicht Teil einer 2D-Faltung (aus mathematischer Sicht), sondern etwas, was Faltungsschichten in CNNs tun.
Anmerkungen :
1: Abgesehen davon denke ich, dass die meisten von Ihnen angegebenen Quellen, gelinde gesagt, irreführende Erklärungen enthalten und nicht korrekt sind. Mir war nicht bewusst, dass so viele Quellen diese Operation (die die wichtigste Operation in CNNs ist) falsch machen. Ich denke, es hat etwas damit zu tun, dass Faltungen das Produkt zwischen Skalaren summieren und das Produkt zwischen zwei Skalaren auch als Punktprodukt bezeichnet wird .
2: Ich denke, dass sich die erste Referenz auf eine vollständig verbundene Ebene anstelle einer Faltungsschicht bezieht. Wenn dies der Fall ist, führt eine FC-Schicht das Punktprodukt wie angegeben aus. Ich habe nicht den Rest des Kontexts, um dies zu bestätigen.
tl; dr Das von Ihnen bereitgestellte Bild ist zu 100% korrekt in Bezug auf die Ausführung des Vorgangs, dies ist jedoch nicht das vollständige Bild. CNN-Schichten haben drei Dimensionen, von denen zwei wie abgebildet behandelt werden. Mein Vorschlag wäre, zu überprüfen, wie Faltungsschichten mit der Tiefe der Eingabe umgehen (der einfachste Fall, den Sie sehen können, sind 1x1-Faltungen).
quelle
Die Operation wird Faltung genannt, die eine Summe von Element für Element-Multiplikation beinhaltet, was wiederum dasselbe ist wie ein Punktprodukt auf mehrdimensionalen Matrizen, die ML-Leute Tensoren nennen. Wenn Sie es als Schleife schreiben, sieht es wie folgt aus: Pseudo-Python-Code:
Hier ist A Ihre 5x5-Eingangsmatrix, C ist ein 3x3-Filter und Z ist eine 3x3-Ausgangsmatrix.
Der subtile Unterschied zu einem Punktprodukt besteht darin, dass sich normalerweise ein Punktprodukt auf den gesamten Vektoren befindet. Während Sie in der Faltung ein Punktprodukt auf der sich bewegenden Teilmenge (Fenster) der Eingabematrix erstellen, können Sie es wie folgt schreiben, um die innersten zwei verschachtelten zu ersetzen Schleifen im obigen Code:
quelle
Ich glaube, der Schlüssel ist, dass, wenn der Filter einen Teil des Bildes (das "Empfangsfeld") faltet, jede Zahl im Filter (dh jedes Gewicht) zuerst in das Vektorformat abgeflacht wird . Ebenso werden die Pixel des Bildes in das Vektorformat abgeflacht . DANN wird das Punktprodukt berechnet. Das ist genau das Gleiche wie das Ermitteln der Summe der Element-für-Element-Multiplikation (elementweise).
Natürlich können diese abgeflachten Vektoren auch in einem Matrixformat kombiniert werden, wie das folgende Bild zeigt. In diesem Fall kann dann eine echte Matrixmultiplikation verwendet werden. Es ist jedoch wichtig zu beachten, dass die Abflachung der Bildpixel von jeder Faltung und auch des Gewichtungsfilters der Vorläufer ist.
Bildnachweis: TensorFlow und Deep Learning ohne Promotion, Teil 1 (Google Cloud Next '17)
quelle