Estoy tratando de comprender el papel de la Flatten
función en Keras. A continuación se muestra mi código, que es una red simple de dos capas. Toma datos bidimensionales de forma (3, 2) y genera datos unidimensionales de 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
Esto imprime que y
tiene forma (1, 4). Sin embargo, si elimino la Flatten
línea, se imprime que y
tiene forma (1, 3, 4).
No entiendo esto. Según mi comprensión de las redes neuronales, la model.add(Dense(16, input_shape=(3, 2)))
función es crear una capa oculta totalmente conectada, con 16 nodos. Cada uno de estos nodos está conectado a cada uno de los elementos de entrada 3x2. Por lo tanto, los 16 nodos en la salida de esta primera capa ya son "planos". Entonces, la forma de salida de la primera capa debería ser (1, 16). Luego, la segunda capa toma esto como una entrada y genera datos de forma (1, 4).
Entonces, si la salida de la primera capa ya es "plana" y tiene forma (1, 16), ¿por qué necesito aplanarla más?
Dense(16, input_shape=(5,3)
, ¿cada neurona de salida del conjunto de 16 (y, para los 5 conjuntos de estas neuronas), se conectará a todas (3 x 5 = 15) neuronas de entrada? ¿O cada neurona en el primer conjunto de 16 solo estará conectada a las 3 neuronas en el primer conjunto de 5 neuronas de entrada, y luego cada neurona en el segundo conjunto de 16 solo estará conectada a las 3 neuronas en el segundo conjunto de 5 entradas? neuronas, etc .... ¡Estoy confundido en cuanto a cuál es!