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?
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!