Explicación de entrada de Keras: input_shape, units, batch_size, dim, etc.

262

Para cualquier capa Keras ( Layerclase), ¿Puede alguien explicar cómo entender la diferencia entre input_shape, units, dim, etc.?

Por ejemplo, el documento dice que unitsespecifique la forma de salida de una capa.

En la imagen de la red neuronal a continuación hidden layer1tiene 4 unidades. ¿Esto se traduce directamente al unitsatributo del Layerobjeto? ¿O unitsen Keras iguala la forma de cada peso en la capa oculta por el número de unidades?

En resumen, ¿cómo se comprende / visualiza los atributos del modelo, en particular las capas, con la imagen a continuación? ingrese la descripción de la imagen aquí

espantapájaros
fuente

Respuestas:

412

Unidades:

La cantidad de "neuronas", o "células", o lo que sea que la capa tenga dentro.

Es una propiedad de cada capa, y sí, está relacionada con la forma de salida (como veremos más adelante). En su imagen, a excepción de la capa de entrada, que es conceptualmente diferente de otras capas, tiene:

  • Capa oculta 1: 4 unidades (4 neuronas)
  • Capa oculta 2: 4 unidades
  • Última capa: 1 unidad

Formas

Las formas son consecuencias de la configuración del modelo. Las formas son tuplas que representan cuántos elementos tiene una matriz o tensor en cada dimensión.

Ej: una forma (30,4,10)significa una matriz o tensor con 3 dimensiones, que contiene 30 elementos en la primera dimensión, 4 en la segunda y 10 en la tercera, con un total de 30 * 4 * 10 = 1200 elementos o números.

La forma de entrada

Lo que fluye entre capas son tensores. Los tensores pueden verse como matrices, con formas.

En Keras, la capa de entrada en sí no es una capa, sino un tensor. Es el tensor inicial que envía a la primera capa oculta. Este tensor debe tener la misma forma que sus datos de entrenamiento.

Ejemplo: si tiene 30 imágenes de 50x50 píxeles en RGB (3 canales), la forma de sus datos de entrada es (30,50,50,3). Entonces su tensor de capa de entrada debe tener esta forma (ver detalles en la sección "formas en keras").

Cada tipo de capa requiere la entrada con un cierto número de dimensiones:

  • Dense las capas requieren entradas como (batch_size, input_size)
    • o (batch_size, optional,...,optional, input_size)
  • Las capas convolucionales 2D necesitan entradas como:
    • si usa channels_last:(batch_size, imageside1, imageside2, channels)
    • si usa channels_first:(batch_size, channels, imageside1, imageside2)
  • Convoluciones 1D y uso de capas recurrentes (batch_size, sequence_length, features)

Ahora, la forma de entrada es la única que debe definir, porque su modelo no puede conocerla. Solo usted lo sabe, según sus datos de entrenamiento.

Todas las otras formas se calculan automáticamente en función de las unidades y particularidades de cada capa.

Relación entre formas y unidades: la forma de salida

Dada la forma de entrada, todas las demás formas son resultados de cálculos de capas.

Las "unidades" de cada capa definirán la forma de salida (la forma del tensor que produce la capa y que será la entrada de la siguiente capa).

Cada tipo de capa funciona de una manera particular. Las capas densas tienen forma de salida basada en "unidades", las capas convolucionales tienen forma de salida basada en "filtros". Pero siempre se basa en alguna propiedad de capa. (Consulte la documentación para ver qué produce cada capa)

Vamos a mostrar lo que sucede con las capas "densas", que es el tipo que se muestra en su gráfico.

Una capa densa tiene una forma de salida de (batch_size,units). Entonces, sí, las unidades, la propiedad de la capa, también definen la forma de salida.

  • Capa oculta 1: 4 unidades, la forma de salida: (batch_size,4).
  • Capa oculta 2: 4 unidades, la forma de salida: (batch_size,4).
  • Última capa: 1 unidad, la forma de salida: (batch_size,1).

Pesas

Los pesos se calcularán de forma totalmente automática en función de las formas de entrada y salida. Nuevamente, cada tipo de capa funciona de cierta manera. Pero los pesos serán una matriz capaz de transformar la forma de entrada en la forma de salida mediante alguna operación matemática.

En una capa densa, los pesos multiplican todas las entradas. Es una matriz con una columna por entrada y una fila por unidad, pero esto a menudo no es importante para trabajos básicos.

En la imagen, si cada flecha tuviera un número de multiplicación, todos los números juntos formarían la matriz de peso.

Formas en Keras

Anteriormente, di un ejemplo de 30 imágenes, 50x50 píxeles y 3 canales, con una forma de entrada de (30,50,50,3).

Como la forma de entrada es la única que necesita definir, Keras la exigirá en la primera capa.

Pero en esta definición, Keras ignora la primera dimensión, que es el tamaño del lote. Su modelo debe poder manejar cualquier tamaño de lote, por lo que debe definir solo las otras dimensiones:

input_shape = (50,50,3)
    #regardless of how many images I have, each image has this shape        

Opcionalmente, o cuando sea requerido por ciertos tipos de modelos, puede pasar la forma que contiene el tamaño del lote a través de batch_input_shape=(30,50,50,3)o batch_shape=(30,50,50,3). Esto limita sus posibilidades de entrenamiento a este tamaño de lote único, por lo que debe usarse solo cuando sea realmente necesario.

De cualquier manera que elija, los tensores en el modelo tendrán la dimensión del lote.

Entonces, incluso si lo usó input_shape=(50,50,3), cuando Keras le envía mensajes, o cuando imprime el resumen del modelo, se mostrará (None,50,50,3).

La primera dimensión es el tamaño del lote, Noneporque puede variar según la cantidad de ejemplos que brinde para la capacitación. (Si definió el tamaño del lote explícitamente, aparecerá el número que definió en lugar de None)

Además, en trabajos avanzados, cuando realmente opera directamente en los tensores (dentro de las capas de Lambda o en la función de pérdida, por ejemplo), la dimensión del tamaño del lote estará allí.

  • Entonces, al definir la forma de entrada, ignora el tamaño del lote: input_shape=(50,50,3)
  • Al realizar operaciones directamente en tensores, la forma será nuevamente (30,50,50,3)
  • Cuando Keras le envíe un mensaje, la forma será (None,50,50,3)o (30,50,50,3), según el tipo de mensaje que le envíe.

Oscuro

Y al final, ¿qué es dim?

Si su forma de entrada tiene solo una dimensión, no necesita darla como una tupla, sino como un input_dimnúmero escalar.

Entonces, en su modelo, donde su capa de entrada tiene 3 elementos, puede usar cualquiera de estos dos:

  • input_shape=(3,) - La coma es necesaria cuando solo tienes una dimensión
  • input_dim = 3

Pero cuando se trata directamente con los tensores, a menudo dimse referirá a cuántas dimensiones tiene un tensor. Por ejemplo, un tensor con forma (25,10909) tiene 2 dimensiones.


Definiendo tu imagen en Keras

Keras tiene dos formas de hacerlo, Sequentialmodelos o la API funcional Model. No me gusta usar el modelo secuencial, más tarde tendrás que olvidarlo de todos modos porque querrás modelos con ramas.

PD: aquí ignoré otros aspectos, como las funciones de activación.

Con el modelo secuencial :

from keras.models import Sequential  
from keras.layers import *  

model = Sequential()    

#start from the first hidden layer, since the input is not actually a layer   
#but inform the shape of the input, with 3 elements.    
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input

#further layers:    
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer   

Con el modelo API funcional :

from keras.models import Model   
from keras.layers import * 

#Start defining the input tensor:
inpTensor = Input((3,))   

#create the layers and pass them the input tensor to get the output tensor:    
hidden1Out = Dense(units=4)(inpTensor)    
hidden2Out = Dense(units=4)(hidden1Out)    
finalOut = Dense(units=1)(hidden2Out)   

#define the model's start and end points    
model = Model(inpTensor,finalOut)

Formas de los tensores

Recuerde que ignora los tamaños de lote al definir capas:

  • inpTensor: (None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • finalOut: (None,1)
Daniel Möller
fuente
77
input_shape=Queda una pregunta sobre el parámetro: ¿a qué dimensión se refiere el primer valor del argumento? Veo cosas como input_shape=(728, ), así que, en mi opinión, el primer argumento se refiere a columnas (fijas) y el segundo a filas (libre de variar). Pero, ¿cómo se sienta esto con el orden de matrices de fila mayor de Python?
Maxim.K
17
Esa coma no crea una segunda dimensión. Es solo la notación de Python para crear un tupleque contiene solo un elemento. input_shape(728,)es el mismo que batch_input=(batch_size,728). Esto significa que cada muestra tiene 728 valores.
Daniel Möller
@ DanielMöller: ¿podría explicar un poco cuál es la diferencia entre "elementos de entrada" y "dimensiones"? Creo que el gráfico anterior tenía una capa de entrada tridimensional, por lo que dim = 3 , así que me pregunto qué me estoy perdiendo aquí, porque veo que escribes que la entrada es unidimensional ...
Helen
1
Un vector tiene una dimensión, pero muchos elementos. Tiene forma (n,) ---- Una matriz tiene dos dimensiones, la dimensión 0 tiene m elementos, la dimensión 1 tiene n elementos, totalizando mxn elementos, forma (m, n). Si imagina un "cubo" dividido en pequeños cubos, cada pequeño cubo con datos, sería 3D, con elementos mxnxo, forma (m, n, o).
Daniel Möller
2
@Prince, el orden importa. Puede configurar Keras para usar data_format = 'channels_first'o data_format='channels_last'. Recomiendo usar siempre los canales al final (predeterminado de Keras). Es más compatible con todas las demás capas.
Daniel Möller
11

Dimensión de entrada aclarada:

No es una respuesta directa, pero me di cuenta de que la palabra Dimensión de entrada podría ser lo suficientemente confusa, así que ten cuidado:

Esto (la palabra dimensión sola) puede referirse a:

a) La dimensión de los datos de entrada (o flujo) , como el n. ° N de los ejes del sensor para transmitir la señal de la serie temporal o el canal de color RGB (3): palabra sugerida => "Dimensión de flujo de entrada"

b) El número / longitud total de las características de entrada (o capa de entrada) (28 x 28 = 784 para la imagen en color MINST) o 3000 en los valores de espectro transformados por FFT, o

"Capa de entrada / Dimensión de la característica de entrada"

c) La dimensionalidad (# de dimensión) de la entrada (típicamente 3D como se esperaba en Keras LSTM) o (#RowofSamples, #of Senors, #of Values ​​...) 3 es la respuesta.

"N Dimensionalidad de entrada"

d) La forma de entrada ESPECÍFICA (por ejemplo, (30,50,50,3) en estos datos de imagen de entrada sin envolver, o (30, 250, 3) si Keras sin envolver :

Keras tiene su input_dim se refiere a la dimensión de la capa de entrada / número de característica de entrada

model = Sequential()
model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
model.add(Activation('relu'))

En Keras LSTM, se refiere a los Pasos de tiempo totales

¡El término ha sido muy confuso, es correcto y vivimos en un mundo muy confuso!

Encuentro que uno de los desafíos en Machine Learning es tratar con diferentes idiomas o dialectos y terminologías (como si tuvieras 5-8 versiones muy diferentes de inglés, entonces necesitas un dominio muy alto para conversar con diferentes hablantes). Probablemente esto sea lo mismo en los lenguajes de programación también.

r poon
fuente