如何计算单个图像embedding与一组图像embedding的余弦相似度距离?
单图像embedding与embedding组的距离计算方法
你使用的TensorFlow内置余弦相似度接口本身支持批量计算,仅需做简单的维度适配即可实现1对N的计算,无需循环逐个计算,执行效率更高。
核心逻辑
余弦相似度的计算支持TensorFlow的广播机制,只需将形状为(1028,)的单个embedding扩展为(1, 1028)的二维张量,即可直接和形状为(5,1028)的embedding组做批量运算,输出结果为长度为5的数组,对应单张图和组内每张图的相似度/距离值。
代码实现
基于Keras CosineSimilarity接口的实现
import tensorflow as tf from tensorflow.keras import metrics # 输入处理:如果你的embedding group是Python列表,先转为TF张量 embedding_single = tf.convert_to_tensor(Embedding_1) # 形状(1028,) embedding_group = tf.convert_to_tensor(Embedding_Group) # 形状(5, 1028) # 给单个embedding增加批次维度,形状变为(1, 1028) embedding_single_expanded = tf.expand_dims(embedding_single, axis=0) # 批量计算余弦相似度,axis=1指定在特征维度计算 cosine_similarity = metrics.CosineSimilarity(axis=1)(embedding_single_expanded, embedding_group) # 如需得到余弦距离,用1减去相似度即可(相似度范围[-1,1],距离范围[0,2]) cosine_distance = 1 - cosine_similarity
手动实现版本(更易自定义调整)
如果不想依赖Keras的Metrics接口,也可以用基础算子直接实现:
# 对两个张量做L2归一化 norm_single = tf.nn.l2_normalize(embedding_single_expanded, axis=1) norm_group = tf.nn.l2_normalize(embedding_group, axis=1) # 点积计算得到余弦相似度,结果和接口实现完全一致 cosine_similarity = tf.reduce_sum(tf.multiply(norm_single, norm_group), axis=1)
注意事项
- 如果你的embedding组规模非常大(比如万级以上),建议配合TensorFlow的矩阵运算优化能力,不要用Python循环逐对计算,性能差距可达百倍以上
- 注意区分余弦相似度和余弦距离的取值范围,避免后续相似度排序时逻辑搞反
内容的提问来源于stack exchange,提问作者ZZZZZZZZZ
相关产品推荐
相关产品推荐

