Agregar vs concatenar la capa en Keras
Estoy revisando diferentes arquitecturas de redes neuronales e intentando entender cómo recrearlas por mí mismo.
Un problema con el que me encuentro es la diferencia funcional entre las capas Concatenate()
y Add()
en Keras. Parece que logran cosas similares (combinar múltiples capas juntas), pero no logro ver la diferencia real entre ambas.
Aquí hay un ejemplo de un modelo Keras que toma dos entradas separadas y luego las combina:
inputs1 = Input(shape=(32, 32, 3))
inputs2 = Input(shape=(32, 32, 3))
x1 = Conv2D(kernel_size=24, strides=1, filters=64, padding="same")(inputs1)
x1 = BatchNormalization()(x1)
x1 = ReLU()(x1)
x1 = Conv2D(kernel_size=24, strides=1, filters=64, padding="same")(x1)
x2 = Conv2D(kernel_size=24, strides=1, filters=64, padding="same")(inputs2)
x2 = BatchNormalization()(x2)
x2 = ReLU()(x2)
x2 = Conv2D(kernel_size=24, strides=1, filters=64, padding="same")(x2)
add = Concatenate()([x1, x2])
out = Flatten()(add)
out = Dense(24, activation='softmax')(out)
out = Dense(10, activation='softmax')(out)
out = Flatten()(out)
mod = Model([inputs1, inputs2], out)
Puedo reemplazar la capa Add()
con la capa Concatenate()
y todo funciona bien, y los modelos parecen similares, pero tengo dificultades para entender la diferencia.
Como referencia, aquí tienes el gráfico de cada uno usando la función plot_model
de Keras:
MODELO KERAS CON CAPAS AÑADIDAS:
MODELO KERAS CON CAPAS CONCATENADAS:
Observo que cuando concatenas, el tamaño del modelo es mayor en comparación con cuando se agregan capas. ¿Es el caso que, en una concatenación, simplemente apilas los pesos de las capas anteriores uno encima del otro, y con un Add()
, sumas los valores?
Parece que debería ser más complicado, pero no estoy seguro.
davy.ai
Las capas
Concatenate()
yAdd()
en Keras proporcionan formas de combinar múltiples capas juntas, pero tienen diferentes propósitos funcionales.La capa
Add()
realiza la suma elemento a elemento de sus entradas. Esto significa que cada valor se suma a su valor correspondiente en la(s) otra(s) entrada(s). Esto es útil cuando se desea agregar dos o más capas juntas para crear una nueva representación. Por ejemplo, en una arquitectura de red residual, es posible que tenga una conexión de atajo que agrega la entrada directamente a la salida de un bloque convolucional.Por otro lado, la capa
Concatenate()
concatena las entradas a lo largo de un eje especificado. Esto significa que las salidas de las entradas se apilan una al lado de la otra, en lugar de sumarse. Esto es útil cuando se desea combinar diferentes representaciones o procesar múltiples entradas antes de combinarlas.En cuanto al tamaño del modelo, ambas capas agregarán parámetros al modelo. La capa
Add()
tendrá el mismo número de parámetros que las entradas, mientras que la capaConcatenate()
tendrá más parámetros, ya que necesita aprender cómo combinar las entradas.En el ejemplo proporcionado, el uso de la capa
Concatenate()
tiene sentido, ya que las dos imágenes de entrada se procesan por separado antes de combinarse. El uso de la capaAdd()
no sería apropiado en este caso.