Redes Siamesas con TensorFlow y Keras: Aprende a comparar datos como un experto en Deep Learning

Descubre cómo las redes neuronales siamesas están revolucionando tareas de comparación de imágenes, textos y más. Una guía práctica, actualizada para dominar su implementación con tensorflow y Keras.
En el universo del machine learning y la inteligencia artificial, las redes neuronales siamesas han emergido como una poderosa arquitectura para abordar uno de los desafíos más comunes: la comparación de elementos que no son exactamente iguales pero comparten similitudes estructurales o semánticas.
Su aplicabilidad se ha extendido desde la verificación biométrica hasta la detección de duplicados y la búsqueda de similitudes en textos, imágenes o incluso audio.
En este artículo, exploramos a fondo cómo implementar redes siamesas con Keras y TensorFlow, los dos frameworks más populares en el mundo del deep learning, y cómo esta arquitectura puede transformar tareas de comparación compleja en soluciones precisas, eficientes y escalables.
¿Qué es una red neuronal siamesa y por qué deberías conocerla?
Una red neuronal siamesa es una arquitectura compuesta por dos (o más) subredes idénticas que comparten los mismos pesos y parámetros.
Su objetivo principal no es clasificar directamente, sino medir la similitud entre dos entradas, como por ejemplo si dos imágenes pertenecen al mismo individuo o si dos textos expresan la misma intención.
Este tipo de red fue introducido por primera vez en la década de los 90, en el contexto del reconocimiento de firmas, pero su auge llegó con la explosión del deep learning gracias a su capacidad para aprender representaciones vectoriales comparables (embeddings) que permiten cuantificar similitudes.
Aplicaciones destacadas de las redes siamesas
🧠 ¿Cómo funciona una red siamesa en la práctica?
Una red neuronal siamesa opera bajo un principio fundamental: comparar en lugar de clasificar.
Esto supone una diferencia esencial respecto a las arquitecturas convencionales de redes neuronales, que normalmente reciben una única entrada y emiten una predicción directa (por ejemplo, "esto es un perro" o "esto es una letra A").
En cambio, las redes siamesas están diseñadas para recibir dos entradas distintas de forma simultánea y aprender a determinar el grado de similitud entre ellas.
Dos entradas, una arquitectura compartida
En términos prácticos, cada una de las entradas —que pueden ser imágenes, fragmentos de texto, señales de audio o incluso vectores numéricos— se procesa por separado a través de dos redes neuronales idénticas, conocidas como subredes gemelas o twin networks.
Lo que hace únicas a estas subredes es que comparten exactamente los mismos pesos y parámetros, es decir, están sincronizadas durante todo el entrenamiento.
Esta propiedad garantiza que ambas entradas se transforman siguiendo el mismo criterio, produciendo representaciones comparables —conocidas como embeddings o vectores de características— en un espacio latente común. En otras palabras, la red aprende a proyectar los datos de entrada en un espacio matemático donde la distancia entre vectores refleja su nivel de similitud o diferencia.
De datos crudos a vectores comparables
Una vez procesadas ambas entradas, se obtienen dos vectores de salida, uno por cada rama de la red siamesa.
Estos vectores encapsulan las características más relevantes de cada entrada, según lo aprendido durante el entrenamiento.
En el caso de imágenes, por ejemplo, podrían representar patrones visuales como contornos, texturas o estructuras; en texto, podrían representar la semántica de una frase o la intención detrás de una consulta.
Estos vectores no se clasifican, sino que se comparan directamente mediante una función matemática de distancia o similitud. Las funciones más comúnmente utilizadas en redes siamesas incluyen:
¿Qué aprende exactamente la red?
El objetivo del entrenamiento de una red siamesa es ajustar sus pesos para que la distancia entre los vectores de entrada refleje la similitud semántica real entre ellos.
Funciones de pérdida diseñadas para similitud
Este aprendizaje no se logra con funciones de pérdida tradicionales como la categorical cross-entropy. En su lugar, se emplean funciones de pérdida específicas para comparación, que están diseñadas para trabajar con distancias entre vectores. Las dos más comunes son:
1. Contrastive Loss
Utilizada cuando el entrenamiento se hace con pares etiquetados (positivo o negativo). Esta función penaliza dos tipos de error:
La fórmula básica es:
iniCopyEditLoss = (Y) * D² + (1 - Y) * max(margin - D, 0)²
Donde:
2. Triplet Loss
Aquí se usan tripletas de entrada: un ancla, un ejemplo positivo (similar) y uno negativo (distinto). La red aprende a proyectar los datos en un espacio donde el ancla esté más cerca del positivo que del negativo, con al menos un margen.
Su forma simplificada es:
iniCopyEditLoss = max(d(a, p) - d(a, n) + margin, 0)
Donde:
Este enfoque es más exigente computacionalmente, pero proporciona embeddings más discriminativos y se utiliza en tareas avanzadas como reconocimiento facial (ej. FaceNet).
Implementación eficiente: datos y balance
Uno de los aspectos más importantes (y desafiantes) del funcionamiento práctico de una red siamesa es la preparación del dataset. El modelo no aprende únicamente de los datos en sí, sino de las relaciones entre ellos. Por tanto:

¿Qué sucede durante la inferencia?
Una vez entrenado, el modelo puede utilizarse de forma muy eficiente. Ya no es necesario comparar cada par uno a uno durante la inferencia si se han almacenado los embeddings previamente. Por ejemplo, se puede:
Este proceso es clave para aplicaciones en tiempo real, como verificación de identidad, búsqueda de productos similares o detección de duplicados en bases de datos grandes.
Por tanto, una red neuronal siamesa no intenta reconocer categorías, sino medir relaciones entre pares de datos.
Es un enfoque extremadamente poderoso en escenarios donde la clasificación directa no es posible, o donde las clases cambian constantemente y el modelo debe seguir funcionando sin necesidad de reentrenarse.
Arquitectura general de una red siamesa en Keras y TensorFlow
Veamos cómo se estructura una red siamesa paso a paso utilizando TensorFlow 2.x y Keras como backend:
1. Modelo base compartido (base network)
La red base es responsable de convertir cada entrada en un embedding. Es común utilizar una arquitectura CNN para imágenes o una red LSTM o Transformer para textos.
pythonCopyEditfrom tensorflow.keras import layers, models
def build_base_network(input_shape):
inputs = layers.Input(shape=input_shape)
x = layers.Conv2D(64, (3,3), activation='relu')(inputs)
x = layers.MaxPooling2D()(x)
x = layers.Conv2D(128, (3,3), activation='relu')(x)
x = layers.MaxPooling2D()(x)
x = layers.Flatten()(x)
x = layers.Dense(128, activation='relu')(x)
return models.Model(inputs, x, name="base_network")
2. Entrada doble y combinación
Creamos dos entradas que serán procesadas por la misma red base:
pythonCopyEditinput_a = layers.Input(shape=input_shape)
input_b = layers.Input(shape=input_shape)
base_network = build_base_network(input_shape)
processed_a = base_network(input_a)
processed_b = base_network(input_b)
3. Cálculo de distancia
Una forma común de medir la diferencia entre los dos vectores generados es la distancia euclidiana:
pythonCopyEditfrom tensorflow.keras import backend as K
def euclidean_distance(vects):
x, y = vects
return K.sqrt(K.maximum(K.sum(K.square(x - y), axis=1, keepdims=True), K.epsilon()))
distance = layers.Lambda(euclidean_distance)([processed_a, processed_b])
4. Salida final y compilación
El modelo puede producir una probabilidad de similitud mediante una capa sigmoide:
pythonCopyEditoutput = layers.Dense(1, activation='sigmoid')(distance)
siamese_model = models.Model(inputs=[input_a, input_b], outputs=output)
siamese_model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
¿Qué tipos de pérdidas se usan en redes siamesas?
Existen principalmente dos enfoques para entrenar este tipo de redes:
Contrastive Loss
Ideal para pares de entrada (similar vs no similar). Penaliza la distancia entre pares similares si es muy alta, y penaliza que la distancia entre no similares sea muy baja.
pythonCopyEditdef contrastive_loss(y_true, y_pred):
margin = 1
return K.mean(y_true * K.square(y_pred) +
(1 - y_true) * K.square(K.maximum(margin - y_pred, 0)))
Triplet Loss
En lugar de pares, usa tripletas: ancla, positivo y negativo. La idea es que la distancia entre ancla y positivo debe ser menor que entre ancla y negativo por un margen.
Esta pérdida es más compleja y potente, usada por ejemplo en sistemas como FaceNet.
Dataset y preprocesamiento: una pieza clave
Una parte esencial de entrenar una red siamesa es cómo se construyen los pares o tripletas.
No se trata simplemente de cargar datos, sino de diseñar cuidadosamente los ejemplos para que el modelo aprenda la noción de "similitud" de forma efectiva.
Ejemplo de datasets utilizados:
Además, se pueden generar datos sintéticos para entrenar redes siamesas en tareas personalizadas, utilizando técnicas de data augmentation.
Casos de uso reales y alternativos que transforman industrias
Las redes siamesas no solo son útiles en tareas visuales. Están irrumpiendo en:
1. Sector bancario
2. Sector salud
3. LegalTech
4. E-commerce
Ventajas y desafíos de las redes siamesas
Ventajas
Desafíos
📈 ¿Qué papel juegan las redes siamesas en el futuro del deep learning?
Con la creciente necesidad de modelos que no solo clasifiquen, sino que entiendan relaciones entre datos, las redes siamesas están ganando un papel protagónico. Especialmente en campos como:
Combinadas con técnicas modernas como transformers ligeros o arquitecturas como Siamese BERT, estas redes están evolucionando más allá de su uso clásico en visión por computadora.
En definitiva, las redes neuronales siamesas ofrecen una solución elegante, precisa y adaptable para tareas donde comparar dos entradas es más importante que clasificarlas de forma individual.
Gracias a herramientas como TensorFlow y Keras, su implementación se ha democratizado, permitiendo que tanto investigadores como empresas puedan integrar este enfoque en sus sistemas.
A medida que los problemas del mundo real se vuelven más complejos y relacionales, entender e implementar arquitecturas como las redes siamesas se vuelve no solo útil, sino esencial para quienes desean estar a la vanguardia del desarrollo en inteligencia artificial aplicada.
❓ Preguntas frecuentes sobre redes siamesas
1. ¿Qué diferencia hay entre una red siamesa y una red neuronal tradicional?
Una red neuronal tradicional clasifica entradas de forma directa, mientras que una red siamesa compara dos entradas para evaluar su similitud, utilizando subredes idénticas que comparten pesos.
2. ¿Puedo usar una red siamesa con texto en lugar de imágenes?
Sí. Las redes siamesas pueden adaptarse a distintos tipos de datos, incluidos textos, utilizando redes base como LSTM, GRU o BERT para generar embeddings comparables.
3. ¿Qué función de pérdida debo usar en una red siamesa?
La elección depende del enfoque. Contrastive loss es ideal para pares similares/no similares, mientras que triplet loss se usa con tripletas (ancla, positivo, negativo) para mejorar la discriminación.
4. ¿Es posible entrenar una red siamesa con pocos datos?
Sí, de hecho las redes siamesas son conocidas por funcionar bien en contextos de few-shot learning, donde hay muy pocos ejemplos por clase. Lo importante es generar buenos pares de entrenamiento.
5. ¿Qué tan difícil es implementar una red siamesa en Keras?
Con TensorFlow 2.x y Keras, es relativamente sencillo gracias a su API funcional. Sin embargo, es fundamental entender cómo construir los datos y elegir correctamente la arquitectura y función de pérdida.


Deja una respuesta