wake-up-neo.com

Rolle von "Flatten" in Keras

Ich versuche die Rolle der Funktion Flatten in Keras zu verstehen. Unten ist mein Code, der ein einfaches zweischichtiges Netzwerk ist. Es nimmt zweidimensionale Daten der Form (3, 2) auf und gibt eindimensionale Daten der Form (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 gibt aus, dass y die Form (1, 4) hat. Wenn ich jedoch die Zeile Flatten entferne, wird gedruckt, dass y eine Form hat (1, 3, 4).

Ich verstehe das nicht. Nach meinem Verständnis neuronaler Netze erzeugt die Funktion model.add(Dense(16, input_shape=(3, 2))) eine versteckte, vollständig verbundene Ebene mit 16 Knoten. Jeder dieser Knoten ist mit jedem der 3x2 Eingangselemente 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 Daten der Form (1, 4) aus.

Wenn die Ausgabe der ersten Ebene bereits "flach" und von Form ist (1, 16), warum muss ich sie dann weiter abflachen?

Vielen Dank!

65
Karnivaurus

wenn Sie eine Dokumentation von Dense lesen, sehen Sie Folgendes:

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

dies würde ein Dense Netzwerk mit 3 Eingängen und 16 Ausgängen ergeben, das unabhängig für jeden der 5 Schritte angewendet würde. Wenn also D(x) einen dreidimensionalen Vektor in einen 16-d-Vektor umwandelt, erhalten Sie als Ausgabe von 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 erreichen, können Sie zuerst Ihre Eingabe in einen 15-d-Vektor Flatten und dann Dense anwenden:

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

BEARBEITEN: Da einige Menschen Schwierigkeiten hatten zu verstehen, haben Sie hier ein erklärendes Bild:

enter image description here

81
Marcin Możejko

kurz gelesen:

Wenn Sie einen Tensor abflachen, werden alle Dimensionen mit einer Ausnahme entfernt. Genau das macht die Ebene Abflachen.

lange gelesen:

Wenn wir das ursprüngliche Modell (mit der Ebene Abflachen) 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 etwas mehr Sinn für die Eingabe- und Ausgabegrößen für jede Ebene.

Wie Sie lesen können, lautet die Ausgabeform für die Ebene Abflachen (None, 48). Hier ist der Tipp. Sie sollten es lesen (1, 48) Oder (2, 48) Oder ... oder (16, 48) ... oder (32, 48), ...

Tatsächlich bedeutet None an dieser Position eine beliebige Stapelgröße. Damit die Eingaben abgerufen werden können, bedeutet die erste Dimension die Stapelgröße und die zweite die Anzahl der Eingabe-Features.

Die Rolle der Ebene Abflachen in Keras ist ganz einfach:

Durch eine Abflachungsoperation an einem Tensor wird der Tensor so umgeformt, dass er die Form hat, die der Anzahl der im Tensor enthaltenen Elemente entspricht , ohne die Chargendimension .

enter image description here


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

12
prosti

enter image description here So konvertiert Flatten Matrix in ein einzelnes Array.

3
Mahesh Kembhavi