¿Cuál es el papel de “Flatten” en Keras?

108

Estoy tratando de comprender el papel de la Flattenfunció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 ytiene forma (1, 4). Sin embargo, si elimino la Flattenlínea, se imprime que ytiene 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?

Karnivaurus
fuente

Respuestas:

123

Si lee la entrada de la documentación de Keras Dense, verá que esta llamada:

Dense(16, input_shape=(5,3))

daría como resultado una Densered con 3 entradas y 16 salidas que se aplicarían de forma independiente para cada uno de los 5 pasos. Entonces, si D(x)transforma un vector tridimensional en un vector 16-d, lo que obtendrá como salida de su capa sería una secuencia de vectores: [D(x[0,:]), D(x[1,:]),..., D(x[4,:])]con forma (5, 16). Para tener el comportamiento que especifique, primero puede Flatteningresar su entrada a un vector de 15 d y luego aplicar Dense:

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

EDITAR: Como algunas personas lucharon por entender, aquí tienes una imagen explicativa:

ingrese la descripción de la imagen aquí

Marcin Możejko
fuente
Gracias por tu explicación. Sin embargo, solo para aclarar: con 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!
Karnivaurus
1
Tiene una capa densa que obtiene 3 neuronas y la salida 16 que se aplica a cada uno de los 5 conjuntos de 3 neuronas.
Marcin Możejko
1
Ah ok. Lo que estoy tratando de hacer es tomar una lista de 5 píxeles de color como entrada y quiero que pasen por una capa completamente conectada. Entonces 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 la Flattencapa inmediatamente al principio me daría lo que quiero?
Karnivaurus
8
Un pequeño dibujo con y sin Flattenpuede ayudar a comprender.
Xvolks
2
Ok, chicos, les proporcioné una imagen. Ahora puedes eliminar tus votos negativos.
Marcin Możejko
52

ingrese la descripción de la imagen aquí Así es como Flatten funciona convirtiendo Matrix en una matriz única.

Mahesh Kembhavi
fuente
4
Este chico necesita hacer más fotografías. Me gusta esto. Que tiene sentido.
alofgran
10
Sí, pero ¿por qué es necesario? Creo que esta es la pregunta real.
Helen - abajo con PCorrectness
35

lectura corta:

Aplanar un tensor significa eliminar todas las dimensiones excepto una. Esto es exactamente lo que hace la capa Flatten.

lectura larga:

Si tomamos en consideración el modelo original (con la capa Flatten) creado, podemos obtener el siguiente resumen del modelo:

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0

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, Noneen 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 .

ingrese la descripción de la imagen aquí


Nota: utilicé el model.summary()método para proporcionar la forma de salida y los detalles de los parámetros.

prosti
fuente
1
Diagrama muy revelador.
Shrey Joshi
1
Gracias por el diagrama. Me da una imagen clara.
Sultan Ahmed Sagor
0

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.

roberto
fuente
0

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).

Un ingeniero
fuente