es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,)]

Tags:  , , ,

Answer

  1. Avatar for 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:

    import tensorflow as tf
    import numpy as np
    
    # crea un embedding aleatorio para compararlo con el grupo
    emb_1 = tf.constant(np.random.randn(1, 1028), dtype=tf.float32)
    
    # crea un grupo de embeddings aleatorios para compararlos
    emb_group = tf.constant(np.random.randn(5, 1028), dtype=tf.float32)
    
    # calcula las distancias en parejas utilizando la similitud coseno
    norms_1 = tf.norm(emb_1, axis=1)
    norms_2 = tf.norm(emb_group, axis=1)
    dot_products = tf.matmul(emb_1, tf.transpose(emb_group))
    cosine_similarities = dot_products / (norms_1[:,None] * norms_2[None,:])
    distances = 1 - cosine_similarities
    
    # distances es un tensor de forma (1, 5) que contiene las distancias entre emb_1 y cada embedding en emb_group
    print(distances)
    

    En el código anterior, primero creamos un embedding aleatorio emb_1 y un grupo de embeddings aleatorios emb_group. Luego calculamos las distancias en pareja entre emb_1 y cada embedding en emb_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 y emb_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 entre emb_1 y cada embedding en emb_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 en emb_group utilizando distances[0].

Comments are closed.