J'essaie de comprendre le rôle de la Flatten
fonction dans Keras. Voici mon code, qui est un simple réseau à deux couches. Il prend des données bidimensionnelles de forme (3, 2) et produit des données unidimensionnelles de forme (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
Cela imprime qui y
a la forme (1, 4). Cependant, si je supprime la Flatten
ligne, elle imprime la y
forme (1, 3, 4).
Je ne comprends pas ça. D'après ma compréhension des réseaux de neurones, la model.add(Dense(16, input_shape=(3, 2)))
fonction crée une couche caché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 en 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 comme une entrée et produit 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 ai-je besoin de l'aplatir davantage?
la source
Dense(16, input_shape=(5,3)
, chaque neurone de sortie de l'ensemble des 16 (et, pour les 5 ensembles de ces neurones), sera-t-il connecté à tous les neurones d'entrée (3 x 5 = 15)? Ou est-ce que chaque neurone du premier ensemble de 16 ne sera connecté qu'aux 3 neurones du premier ensemble de 5 neurones d'entrée, puis chaque neurone du deuxième ensemble de 16 n'est connecté qu'aux 3 neurones du second ensemble de 5 entrées neurones, etc .... Je ne sais pas trop de quoi il s'agit!input_shape=(5,3)
Cela signifie donc qu'il y a 5 pixels et que chaque pixel a trois canaux (R, V, B). Mais selon ce que vous dites, chaque canal serait traité individuellement, alors que je veux que les trois canaux soient traités par tous les neurones de la première couche. Est-ce que l'application duFlatten
calque immédiatement au début me donnerait ce que je veux?Flatten
peut aider à comprendre.C'est ainsi que Flatten fonctionne en convertissant Matrix en un seul tableau.
la source
courte lecture:
longue lecture:
Si nous prenons en compte le modèle d'origine (avec la couche Aplatir) créé, nous pouvons obtenir le résumé du modèle suivant:
Pour ce résumé, l'image suivante fournira, espérons-le, un peu plus de sens sur les tailles d'entrée et de sortie pour chaque couche.
La forme de sortie du calque Aplatir telle que vous pouvez la 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 toute taille de lot. Pour les entrées à rappeler, la première dimension signifie la taille du lot et la seconde le nombre d'entités d'entrée.Le rôle de la couche Flatten dans Keras est super simple:
Une opération d'aplatissement sur un tenseur remodèle le tenseur pour avoir la forme qui est égale au nombre d'éléments contenus dans le tenseur ne comprenant pas la dimension du lot .
Remarque: j'ai utilisé la
model.summary()
méthode pour fournir la forme de sortie et les détails des paramètres.la source
Flatten explicite la manière dont vous sérialisez un tenseur multidimensionnel (typiquement celui d'entrée). Cela permet le mappage entre le tenseur d'entrée (aplati) et le premier calque caché. Si la première couche cachée est "dense", chaque élément du tenseur d'entrée (sérialisé) sera connecté à chaque élément du tableau caché. Si vous n'utilisez pas Flatten, la façon dont le tenseur d'entrée est mappé sur la première couche masquée serait ambiguë.
la source
Je suis tombé sur cela récemment, cela m'a certainement aidé à comprendre: https://www.cs.ryerson.ca/~aharley/vis/conv/
Il y a donc une entrée, un Conv2D, MaxPooling2D etc., les couches Flatten sont à la fin et montrent exactement comment elles sont formées et comment elles définissent les classifications finales (0-9).
la source