如何在Matlab中计算embedding间余弦距离 含PyTorch tensor转.mat方法
PyTorch张量导出为.mat文件方法
直接用scipy的savemat接口即可完成转换,代码如下:
import torch from scipy.io import savemat # 假设你的原始张量为image_features,尺寸为 [200000, 512] # 先将张量移到CPU、断开计算图后转numpy数组 image_features_np = image_features.detach().cpu().numpy() # 导出为mat格式文件,字典的key对应Matlab中读取后的变量名 savemat("image_features.mat", {"image_features": image_features_np})
200000×512的单精度数组导出后的.mat文件约为400MB,导出过程无额外内存压力。
Matlab端余弦相似度计算实现
注意:200000个向量两两计算生成的全量相似度矩阵尺寸为200000×200000,单精度存储需要约149GB内存,普通消费级设备无法直接承载,若无全量矩阵需求,建议直接使用下方Top K近邻计算方案。
全量相似度矩阵计算(仅适用于大内存服务器)
你之前的PyTorch代码实际计算的是向量内积,若要得到标准余弦相似度,需要先对每个embedding做L2归一化再做矩阵乘,Matlab实现代码如下:
% 读取导出的mat文件 load('image_features.mat'); % 对每个行向量做L2归一化,若你的张量已提前完成归一化可跳过该行 norm_features = normalize(image_features, 2, 'norm'); % 矩阵乘法计算所有两两余弦相似度 similarity = norm_features * norm_features';
Top K相似结果计算(普通设备可用)
如果只需要每个embedding匹配前K个最相似的结果,不需要全量矩阵,可以直接调用Matlab内置的K近邻搜索接口,内存占用极低:
% 读取导出的mat文件 load('image_features.mat'); K = 10; % 自定义需要返回的Top K数量 % 基于余弦距离计算每个向量的Top K近邻,返回对应索引和余弦距离 [idx, cosine_distance] = knnsearch(image_features, image_features, 'K', K, 'Distance', 'cosine'); % 如需转换为余弦相似度,执行:cosine_similarity = 1 - cosine_distance;
内容的提问来源于stack exchange,提问作者sendhelpplize
相关产品推荐
相关产品推荐

