记录一个bug,同一个模型输出保存为npy后计算余弦相似度与欧式距离后,发现余弦相似度为nan,
import numpy as np
# 读取两个 .npy 文件
# array1 = np.load('./code/fbocc-train/onnx_context_res.npy')
array1 = np.load('./code/fbocc-train/res_npy/pth_context_res.npy')
array2 = np.load('./code/fbocc-train/res_npy/pth_context_res.npy')
# 计算欧氏距离
euclidean_distance = np.linalg.norm(array1 - array2)
# 计算余弦相似度
dot_product = np.sum(array1 * array2)
norm_array1 = np.linalg.norm(array1)
norm_array2 = np.linalg.norm(array2)
cosine_similarity = dot_product / (norm_array1 * norm_array2)
print("欧氏距离:", euclidean_distance)
print("余弦相似度:", cosine_similarity)
原因就是模型输出时两个输出的精度不同,一个是float16,一个是float32,在做除法时有问题
print("context: ", context.cpu().numpy().dtype)
print("depth: ", depth.cpu().numpy().dtype)
np.save("./res_npy/pth_context_res.npy", context.cpu().numpy())
np.save("./res_npy/pth_depth_res.npy", depth.cpu().numpy())
解决方法,在保存npy时就转换成float32位的
import numpy as np
# 假设 feat 是您要保存的 float32 格式的数据
feat = np.array([1.0, 2.0, 3.0], dtype=np.float32)
# 保存为 .npy 文件
np.save("./feat.npy", feat)
另外,onnx推理时不会出现这个问题,onnx会对结果类型进行自动转换。