¿Qué hace aplicar una capa en un modelo?
Estoy trabajando con la API de tensorflow.keras
y me he encontrado con una sintaxis con la que no estoy familiarizado, es decir, aplicar una capa en la salida de un submodelo, como se muestra en el siguiente ejemplo del tutorial de este enlace:
from tensorflow.keras import Model, layers
from tensorflow.keras.applications import resnet
target_shape = (200, 200)
base_cnn = resnet.ResNet50(
weights="imagenet", input_shape=target_shape + (3,), include_top=False
)
flatten = layers.Flatten()(base_cnn.output)
dense1 = layers.Dense(512, activation="relu")(flatten)
dense1 = layers.BatchNormalization()(dense1)
dense2 = layers.Dense(256, activation="relu")(dense1)
dense2 = layers.BatchNormalization()(dense2)
output = layers.Dense(256)(dense2)
embedding = Model(base_cnn.input, output, name="Embedding")
En la documentación oficial de layers.Flatten
, por ejemplo, no pude encontrar una explicación de lo que hace aplicándolo en una capa. En la referencia de keras.Layer
encontré esta explicación:
call(self, inputs, args, *kwargs): Llamado en call después de asegurarse de que se haya llamado a build(). call() realiza la lógica de aplicar la capa a los tensores de entrada (que deben pasar como argumento).
Entonces, mi pregunta es:
¿Qué hace flatten = layers.Flatten()(base_cnn.output)
?
davy.ai
La sintaxis
flatten = layers.Flatten()(base_cnn.output)
aplica la capaFlatten
a la salida del modelobase_cnn
. La capaFlatten
toma la salida de la capa anterior (en este caso, la salida del modelobase_cnn
) y la aplana a una sola dimensión. En otras palabras, reorganiza la salida de un tensor de 4 dimensiones (tamaño del lote, altura, ancho, número de canales) a un tensor de 2 dimensiones (tamaño del lote, vector de características plano). Esta salida aplanada luego se pasa como entrada a las capas siguientes (Dense
,BatchNormalization
, etc.) en la red.