machine-learning - tutorial - tensorflow programming
Papel de "aplanar" en Keras (3)
si lee una documentación de
Dense
aquí verá que:
Dense(16, input_shape=(5,3))
daría como resultado una red
Dense
con 3 entradas y 16 salidas que se aplicarían independientemente para cada uno de los 5 pasos.
Entonces, si
D(x)
transforma el vector tridimensional en un vector de 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
Flatten
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:
Estoy tratando de entender el papel de la función
Flatten
en Keras.
A continuación se muestra mi código, que es una red simple de dos capas.
Toma datos de forma bidimensionales (3, 2) y genera datos de forma unidimensionales (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
Flatten
línea
Flatten
, imprime que
y
tiene forma (1, 3, 4).
No entiendo esto
Desde mi comprensión de las redes neuronales, la función
model.add(Dense(16, input_shape=(3, 2)))
está creando una capa oculta completamente 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 debe 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 aún más?
¡Gracias!
lectura corta:
Aplanar un tensor significa eliminar todas las dimensiones excepto una. Esto es exactamente lo que hace la capa Flatten.
larga lectura:
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, la siguiente imagen tendrá un poco más de sentido en los tamaños de entrada y salida para cada capa.
La forma de salida para la capa Flatten como puede leer es
(None, 48)
.
Aquí está el consejo.
Debe 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 las entradas a recuperar, 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 aplanamiento en un tensor da nueva forma al tensor para que tenga la forma que sea igual al número de elementos contenidos en el tensor sin incluir la dimensión del lote .
Nota: Utilicé el método
model.summary()
para proporcionar la forma de salida y los detalles de los parámetros.