Calculando la distancia de una imagen embebida contra un grupo de imágenes embebidas.
¿Cómo obtener correctamente la distancia de una incrustación de imagen frente a una lista/grupo de otras incrustaciones de imagen?
Tengo un modelo preentrenado que estoy usando para extraer incrustaciones de imágenes, y me gustaría obtener la distancia de una imagen frente a unas pocas otras imágenes, es decir,
Incrustación (1028,) frente a Incrustación (5, 1028)
Estoy tratando de hacer un experimento de similitud de imagen donde estoy usando la métrica de similitud de coseno de Tensorflow para calcular la distancia entre dos incrustaciones, y funciona bien en un cálculo de 1 a 1, es decir,
Incrustación_1 = (1028,)
Incrustación_2 = (1028,)
metrics.CosineSimilarity(Incrustación_1, Incrustación_2)
pero no puedo averiguar cómo hacerlo en un cálculo de distancia de 1 a N.
Incrustación_1 = (1028,)
Grupo_Incrustaciones = [(1028,), (1028,), (1028,), (1028,), (1028,)]
davy.ai
Para obtener la distancia de un embedding de imagen contra un grupo de embeddings de imagen, puede utilizar la función de distancia en parejas de Tensorflow. Aquí hay un ejemplo de código:
En el código anterior, primero creamos un embedding aleatorio
emb_1
y un grupo de embeddings aleatoriosemb_group
. Luego calculamos las distancias en pareja entreemb_1
y cada embedding enemb_group
utilizando la similitud coseno.Primero, calculamos la norma L2 de cada embedding (esto se utiliza para normalizar el producto punto más tarde). Luego, calculamos el producto punto entre
emb_1
yemb_group
utilizando la multiplicación de matrices (tf.matmul
). Esto nos brinda una matriz de forma(1, 5)
que contiene las puntuaciones de similitud coseno entreemb_1
y cada embedding enemb_group
. Luego convertimos estas similitudes coseno en distancias (restando de 1) para obtener el resultado final.Tenga en cuenta que
distances
es un tensor de forma(1, 5)
y no(5,)
como podríamos esperar. Esto se debe a que Tensorflow siempre devuelve resultados en formato de lote, incluso si el tamaño del lote es 1. Podemos extraer las distancias para cada embedding enemb_group
utilizandodistances[0]
.