Sto cercando di capire il ruolo della Flattenfunzione in Keras. Di seguito è riportato il mio codice, che è una semplice rete a due strati. Accetta dati bidimensionali di forma (3, 2) e genera dati monodimensionali di forma (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
Questo stampa che yha forma (1, 4). Tuttavia, se rimuovo la Flattenlinea, viene stampata la yforma (1, 3, 4).
Non lo capisco. Dalla mia comprensione delle reti neurali, la model.add(Dense(16, input_shape=(3, 2)))funzione sta creando uno strato nascosto completamente connesso, con 16 nodi. Ciascuno di questi nodi è collegato a ciascuno degli elementi di input 3x2. Pertanto, i 16 nodi all'uscita di questo primo strato sono già "piatti". Quindi, la forma di output del primo livello dovrebbe essere (1, 16). Quindi, il secondo livello lo prende come input e fornisce dati di forma (1, 4).
Quindi, se l'output del primo strato è già "piatto" e di forma (1, 16), perché devo appiattirlo ulteriormente?



Dense(16, input_shape=(5,3), ogni neurone in uscita dall'insieme di 16 (e, per tutti e 5 gli insiemi di questi neuroni), sarà connesso a tutti (3 x 5 = 15) i neuroni in ingresso? Oppure ogni neurone nel primo set di 16 sarà connesso solo ai 3 neuroni nel primo set di 5 neuroni di input, e quindi ogni neurone nel secondo set di 16 sarà connesso solo ai 3 neuroni nel secondo set di 5 input neuroni, ecc .... sono confuso su quale sia!