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?
fuente
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!input_shape=(5,3)
significa que hay 5 píxeles y cada píxel tiene tres canales (R, G, B). Pero de acuerdo con lo que está diciendo, cada canal se procesaría individualmente, mientras que quiero que los tres canales sean procesados por todas las neuronas de la primera capa. Entonces, ¿aplicar laFlatten
capa inmediatamente al principio me daría lo que quiero?Flatten
puede ayudar a comprender.Así es como Flatten funciona convirtiendo Matrix en una matriz única.
fuente
lectura corta:
lectura larga:
Si tomamos en consideración el modelo original (con la capa Flatten) creado, podemos obtener el siguiente resumen del modelo:
Para este resumen, se espera que la siguiente imagen proporcione un poco más de sentido sobre los tamaños de entrada y salida de cada capa.
La forma de salida para la capa Aplanar como puede leer es
(None, 48)
. Aquí está el consejo. Deberías leerlo(1, 48)
o(2, 48)
o ... o(16, 48)
... o(32, 48)
, ...De hecho,
None
en esa posición significa cualquier tamaño de lote. Para que las entradas recuerden, la primera dimensión significa el tamaño del lote y la segunda significa el número de características de entrada.El papel de la capa Flatten en Keras es súper simple:
Una operación de aplanar en un tensor cambia la forma del tensor para que tenga una forma que sea igual al número de elementos contenidos en el tensor sin incluir la dimensión del lote .
Nota: utilicé el
model.summary()
método para proporcionar la forma de salida y los detalles de los parámetros.fuente
Flatten hace explícito cómo serializa un tensor multidimensional (típicamente el de entrada). Esto permite el mapeo entre el tensor de entrada (plano) y la primera capa oculta. Si la primera capa oculta es "densa", cada elemento del tensor de entrada (serializado) se conectará con cada elemento de la matriz oculta. Si no usa Flatten, la forma en que el tensor de entrada se asigna a la primera capa oculta sería ambigua.
fuente
Me encontré con esto recientemente, ciertamente me ayudó a entender: https://www.cs.ryerson.ca/~aharley/vis/conv/
Entonces, hay una entrada, un Conv2D, MaxPooling2D, etc., las capas Flatten están al final y muestran exactamente cómo se forman y cómo continúan para definir las clasificaciones finales (0-9).
fuente