web-dev-qa-db-fra.com

Rôle de "Flatten" dans Keras

J'essaie de comprendre le rôle de la fonction Flatten dans Keras. Voici mon code, qui est un simple réseau à deux couches. Il prend des données de forme bidimensionnelles (3, 2) et génère des données de dimension unidimensionnelles (1, 4):

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

Ceci affiche que y a une forme (1, 4). Cependant, si je supprime la ligne Flatten, elle indique que y a une forme (1, 3, 4).

Je ne comprends pas ça. D'après ma compréhension des réseaux de neurones, la fonction model.add(Dense(16, input_shape=(3, 2))) crée une couche masquée entièrement connectée, avec 16 nœuds. Chacun de ces nœuds est connecté à chacun des éléments d’entrée 3x2. Par conséquent, les 16 nœuds à la sortie de cette première couche sont déjà "plats". Ainsi, la forme de sortie de la première couche doit être (1, 16). Ensuite, la deuxième couche prend cela en entrée et sort des données de forme (1, 4).

Donc, si la sortie de la première couche est déjà "plate" et de forme (1, 16), pourquoi dois-je l'aplatir davantage?

Merci!

65
Karnivaurus

si vous lisez une documentation de Dense ici, vous verrez que:

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

résulterait en un réseau Dense avec 3 entrées et 16 sorties qui serait appliqué indépendamment pour chacune des 5 étapes. Donc, si D(x) transforme un vecteur tridimensionnel en vecteur 16-d, ce que vous obtiendrez en sortie de votre couche sera une séquence de vecteurs: [D(x[0,:], D(x[1,:],..., D(x[4,:]] avec une forme (5, 16). Pour avoir le comportement que vous spécifiez, vous devez d'abord Flatten votre entrée dans un vecteur de 15 jours, puis appliquer 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: Comme certaines personnes ont du mal à comprendre, voici une image explicative:

enter image description here

81
Marcin Możejko

lecture courte:

Aplatir un tenseur signifie supprimer toutes les dimensions sauf une. C'est exactement ce que fait la couche Aplatir.

longue lecture:

Si nous prenons le modèle original (avec la couche Aplatir) créé en considération, nous pouvons obtenir le résumé du modèle suivant:

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

Pour ce résumé, nous espérons que la prochaine image donnera un peu plus de sens sur les tailles d’entrée et de sortie de chaque couche.

La forme de sortie du calque Flatten que vous pouvez lire est (None, 48). Voici le conseil. Vous devriez le lire (1, 48) ou (2, 48) ou ... ou (16, 48) ... ou (32, 48), ...

En fait, None sur cette position signifie n'importe quelle taille de lot. Pour les entrées à rappeler, la première dimension correspond à la taille du lot et la seconde au nombre d'entités en entrée.

Le rôle de la couche aplatir dans Keras est très simple:

Une opération d'aplatissement sur un tenseur redéfinit la forme du tenseur afin qu'elle soit égale au nombre d'éléments contenus dans le tenseur sans la dimension du lot .

enter image description here


Remarque: j'ai utilisé la méthode model.summary() pour fournir la forme de sortie et les détails des paramètres.

12
prosti

enter image description here C’est ainsi que Flatten fonctionne en convertissant Matrix en tableau unique.

3
Mahesh Kembhavi