Welche Rolle spielt „Abflachen“ in Keras?


108

Ich versuche die Rolle der FlattenFunktion 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, ydie Form (1, 4) hat. Wenn ich jedoch die FlattenLinie entferne , wird sie ymit 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?

Antworten:


121

Wenn Sie den Keras-Dokumentationseintrag für lesen Dense, sehen Sie, dass dieser Aufruf:

Dense(16, input_shape=(5,3))

würde zu einem DenseNetzwerk mit 3 Eingängen und 16 Ausgängen führen, das unabhängig für jeden der 5 Schritte angewendet würde. Wenn Sie also D(x)einen dreidimensionalen Vektor in einen 16-d-Vektor umwandeln, erhalten Sie als Ausgabe Ihrer Ebene eine Folge von Vektoren: [D(x[0,:]), D(x[1,:]),..., D(x[4,:])]mit Form (5, 16). Um das von Ihnen angegebene Verhalten zu erhalten, können Sie zuerst FlattenIhre Eingabe in einen 15-d-Vektor eingeben und dann Folgendes anwenden Dense:

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

EDIT: Wie einige Leute Schwierigkeiten hatten zu verstehen - hier haben Sie ein erklärendes Bild:

Geben Sie hier die Bildbeschreibung ein


Danke für Ihre Erklärung. Nur zur Verdeutlichung: Mit 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!
Karnivaurus

1
Sie haben eine dichte Schicht, die 3 Neuronen erhält und 16 ausgibt, die auf jeden von 5 Sätzen von 3 Neuronen angewendet wird.
Marcin Możejko

1
Ah ok. Ich versuche, eine Liste mit 5 Farbpixeln als Eingabe zu verwenden, und ich möchte, dass sie eine vollständig verbundene Ebene durchlaufen. Das 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ürde Flattenmir das Auftragen der Schicht sofort zu Beginn geben, was ich will?
Karnivaurus

8
Eine kleine Zeichnung mit und ohne Flattenkann helfen, zu verstehen.
Xvolks

2
Ok, Leute - ich habe dir ein Bild zur Verfügung gestellt. Jetzt können Sie Ihre Downvotes löschen.
Marcin Możejko


35

kurz lesen:

Das Abflachen eines Tensors bedeutet, dass alle Dimensionen bis auf eine entfernt werden. Genau das macht die Ebene "Reduzieren".

lange gelesen:

Wenn wir das ursprüngliche Modell (mit der Ebene "Reduzieren") berücksichtigen, können wir die folgende Modellzusammenfassung erhalten:

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0

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 Nonebedeutet 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 .

Geben Sie hier die Bildbeschreibung ein


Hinweis: Ich habe die model.summary()Methode verwendet, um die Ausgabeform und Parameterdetails bereitzustellen.


1
Sehr aufschlussreiches Diagramm.
Shrey Joshi

1
Danke für das Diagramm. Es gibt mir ein klares Bild.
Sultan Ahmed Sagor

0

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.


0

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).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.