Ich versuche die Rolle der Flatten
Funktion in Keras zu verstehen . Unten ist mein Code, der ein einfaches zweischichtiges Netzwerk ist. Es nimmt zweidimensionale Formdaten (3, 2) auf und gibt eindimensionale Formdaten (1, 4) aus:
model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')
x = np.array([[[1, 2], [3, 4], [5, 6]]])
y = model.predict(x)
print y.shape
Dies druckt aus, y
die Form (1, 4) hat. Wenn ich jedoch die Flatten
Linie entferne , wird sie y
mit der Form (1, 3, 4) ausgedruckt.
Ich verstehe das nicht Nach meinem Verständnis neuronaler Netze erzeugt die model.add(Dense(16, input_shape=(3, 2)))
Funktion eine verborgene, vollständig verbundene Schicht mit 16 Knoten. Jeder dieser Knoten ist mit jedem der 3x2-Eingabeelemente verbunden. Daher sind die 16 Knoten am Ausgang dieser ersten Schicht bereits "flach". Die Ausgabeform der ersten Schicht sollte also (1, 16) sein. Dann nimmt die zweite Schicht dies als Eingabe und gibt Formdaten (1, 4) aus.
Wenn die Ausgabe der ersten Ebene bereits "flach" und von der Form ist (1, 16), warum muss ich sie dann weiter abflachen?
quelle
Dense(16, input_shape=(5,3)
wird jedes Ausgangsneuron aus dem Satz von 16 (und für alle 5 Sätze dieser Neuronen) mit allen (3 x 5 = 15) Eingangsneuronen verbunden? Oder wird jedes Neuron im ersten Satz von 16 nur mit den 3 Neuronen im ersten Satz von 5 Eingangsneuronen verbunden sein, und dann wird jedes Neuron im zweiten Satz von 16 nur mit den 3 Neuronen im zweiten Satz von 5 Eingangsneuronen verbunden Neuronen, etc .... Ich bin verwirrt, was es ist!input_shape=(5,3)
heißt, es gibt 5 Pixel und jedes Pixel hat drei Kanäle (R, G, B). Aber gemäß dem, was Sie sagen, würde jeder Kanal einzeln verarbeitet, während ich möchte, dass alle drei Kanäle von allen Neuronen in der ersten Schicht verarbeitet werden. WürdeFlatten
mir das Auftragen der Schicht sofort zu Beginn geben, was ich will?Flatten
kann helfen, zu verstehen.So funktioniert Flatten beim Konvertieren von Matrix in ein einzelnes Array.
quelle
kurz lesen:
lange gelesen:
Wenn wir das ursprüngliche Modell (mit der Ebene "Reduzieren") berücksichtigen, können wir die folgende Modellzusammenfassung erhalten:
Für diese Zusammenfassung bietet das nächste Bild hoffentlich wenig mehr Sinn für die Eingabe- und Ausgabegrößen für jede Ebene.
Die Ausgabeform für die Ebene "Reduzieren", wie Sie lesen können, lautet
(None, 48)
. Hier ist der Tipp. Sie sollten es lesen(1, 48)
oder(2, 48)
oder ... oder(16, 48)
... oder(32, 48)
, ...In der Tat
None
bedeutet an dieser Position jede Chargengröße. Damit die Eingaben abgerufen werden können, bedeutet die erste Dimension die Stapelgröße und die zweite die Anzahl der Eingabemerkmale.Die Rolle der Ebene "Reduzieren" in Keras ist sehr einfach:
Eine Abflachungsoperation an einem Tensor formt den Tensor so um, dass er die Form hat, die der Anzahl der im Tensor enthaltenen Elemente ohne die Chargenabmessung entspricht .
Hinweis: Ich habe die
model.summary()
Methode verwendet, um die Ausgabeform und Parameterdetails bereitzustellen.quelle
Flatten machen deutlich, wie Sie einen mehrdimensionalen Tensor serialisieren (typischerweise den eingegebenen). Dies ermöglicht die Zuordnung zwischen dem (abgeflachten) Eingangstensor und der ersten verborgenen Schicht. Wenn die erste verborgene Schicht "dicht" ist, wird jedes Element des (serialisierten) Eingangstensors mit jedem Element des verborgenen Arrays verbunden. Wenn Sie Flatten nicht verwenden, ist die Art und Weise, wie der Eingangstensor auf die erste verborgene Ebene abgebildet wird, nicht eindeutig.
quelle
Ich bin kürzlich darauf gestoßen, es hat mir sicherlich geholfen zu verstehen: https://www.cs.ryerson.ca/~aharley/vis/conv/
Es gibt also eine Eingabe, eine Conv2D, MaxPooling2D usw., die Flatten-Ebenen befinden sich am Ende und zeigen genau, wie sie gebildet werden und wie sie die endgültigen Klassifizierungen definieren (0-9).
quelle