neural network - example - Explicación de entrada de Keras: input_shape, units, batch_size, dim, etc.
keras sequential example (2)
Para cualquier capa de Keras (clase de
Layer
), ¿alguien puede explicar cómo entender la diferencia entre
input_shape
,
units
,
dim
, etc.?
Por ejemplo, el documento dice que las
units
especifican la forma de salida de una capa.
En la imagen de la red neuronal debajo de la
hidden layer1
tiene 4 unidades.
¿Esto se traduce directamente en el atributo de
units
del objeto
Layer
?
¿O las
units
en Keras igualan 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?
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, totalizando 30 * 4 * 10 = 1200 elementos o números.
La forma de entrada
Lo que fluye entre capas son tensores. Los tensores se pueden ver 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)
.
Luego, 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
capasDense
requieren entradas como(batch_size, input_size)
-
o
(batch_size, optional,...,optional, input_size)
-
o
-
Las capas convolucionales 2D necesitan entradas como:
-
si usa
(batch_size, imageside1, imageside2, channels)
:(batch_size, imageside1, imageside2, channels)
-
si utiliza
(batch_size, channels, imageside1, imageside2)
:(batch_size, channels, imageside1, imageside2)
-
si usa
-
Convoluciones 1D y uso de capas recurrentes
(batch_size, sequence_length, features)
- Detalles sobre cómo preparar datos para capas recurrentes
Ahora, la forma de entrada es la única que debe definir, porque su modelo no puede conocerla. Solo tú lo sabes, según tus 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, forma de salida:
(batch_size,4)
. -
Capa oculta 2: 4 unidades, forma de salida:
(batch_size,4)
. -
Última capa: 1 unidad, 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 utilizó
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, es
None
porque 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 volverá a ser
(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, le da
input_dim
como un nú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 tiene una dimensión -
input_dim = 3
Pero cuando se trata directamente con los tensores, a menudo
dim
se 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, modelos
Sequential
o el
Model
API funcional.
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)
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:
(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!
Creo 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.