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, 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 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_dim
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 tienes 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, Sequential
modelos 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)
input_shape=
Queda una pregunta sobre el parámetro: ¿a qué dimensión se refiere el primer valor del argumento? Veo cosas comoinput_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?