Sto cercando di capire il ruolo della Flatten
funzione 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 y
ha forma (1, 4). Tuttavia, se rimuovo la Flatten
linea, viene stampata la y
forma (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!