Python 面网嵌入的余弦距离问题

Python 面网嵌入的余弦距离问题,python,machine-learning,face-recognition,numpy-ndarray,facial-identification,Python,Machine Learning,Face Recognition,Numpy Ndarray,Facial Identification,我在论坛上问过这方面的问题,但这似乎足够有自己的问题 我在网上用余弦距离拍摄了这个片段。但是输出似乎不正确 这是我的代码(注意:我从np.matmul改为np.dot,但仍然没有区别。我也不明白为什么我需要使用转置。没有它它就无法工作……: 导入PIL 从PIL导入图像 导入tensorflow作为tf 将numpy作为np导入 从tensorflow进口keras 从tensorflow.keras.models导入负载_模型 从tensorflow.keras.optimizers导入Ada

我在论坛上问过这方面的问题,但这似乎足够有自己的问题

我在网上用余弦距离拍摄了这个片段。但是输出似乎不正确

这是我的代码(注意:我从
np.matmul
改为
np.dot
,但仍然没有区别。我也不明白为什么我需要使用
转置
。没有它它就无法工作……

导入PIL
从PIL导入图像
导入tensorflow作为tf
将numpy作为np导入
从tensorflow进口keras
从tensorflow.keras.models导入负载_模型
从tensorflow.keras.optimizers导入Adam
从tensorflow.keras.preprocessing.image导入img_到_数组
从sklearn.metrics.pairwise导入余弦_相似性
#负载模型与编译
facenet=load_model('facenet_keras.h5',compile='False')
compile(优化器='adam',loss='classifical_crossentropy',metrics=['accurity'])
def FINDCSINE距离(a、b):
x=np.dot(np.transpose(a),b)
y=np.dot(np.transpose(a),a)
z=np.dot(np.transpose(b),b)
返回(1-(x/(np.sqrt(y)*np.sqrt(z)))
def区(a、b):
#为FaceNet准备图像
a、 b=图像打开(a),图像打开(b)
a、 b=np.数组(a),np.数组(b)
a、 b=Image.fromarray(a),Image.fromarray(b)
a、 b=a.resize((160160)),b.resize((160160))
a、 b=img_至_阵列(a),img_至_阵列(b)
a=a.重塑((1,a.形状[0],a.形状[1],a.形状[2]))
b=b.重塑((1,b.形状[0],b.形状[1],b.形状[2]))
#获取FaceNet嵌入向量
a、 b=facenet.predict(a),facenet.predict(b)
#计算距离度量
输出=查找距离(a,b)
#打印(输出)
#打印((余弦_相似性(a,b)))
打印(输出)
输出:

c:/Users/Jerome Ariola/Desktop:     RuntimeWarning: invalid value encountered in sqrt
  return (1 - (x / (np.sqrt(y) * np.sqrt(z))))
[[ 0.         -0.3677783  -0.1329441  ...  0.2845478  -0.33033693
          nan]
 [ 0.26888728  0.          0.17169017 ...  0.47692382  0.02737373
          nan]
 [ 0.1173439  -0.2072779   0.         ...  0.36850178 -0.17422998
          nan]
 ...
 [-0.39771736 -0.9117675  -0.58353555 ...  0.         -0.85943496
          nan]
 [ 0.24831063 -0.02814436  0.14837813 ...  0.4622023   0.
          nan]
 [        nan         nan         nan ...         nan         nan
   0.        ]]

FaceNet的
predict()
方法似乎正在返回包含NaN值的面嵌入。在计算余弦相似性之前剪裁NaN值可能会有所帮助。请使用下面的代码行进行相同操作:

a, b = np.clip(a, -1000, 1000), np.clip(b, -1000, 1000)

注意:从a和b的值范围中选择使用上述方法进行剪裁的适当阈值。

当前正在处理解决方案,因此我将尝试更新此值:错误源于facenet.predict()输出中的负值。在计算余弦距离之前,在图像上运行的模型和数组中的模型都是负值。余弦距离的公式包括
np.sqrt()
。我尝试了以下方法:

>>将numpy作为np导入
>>>a=[-1,0,1,2,3,4]#带负数的简单数组
>>>a=np.sqrt(a)
__主线程:1:运行时警告:在sqrt中遇到无效值
>>>a
阵列([nan,0,1,1.41421356,1.73205081,
2.        ])
…如我们所见,数组中有NaN值


TL;DR如果我应用
np.abs
会有什么关系,或者这会改变“含义”吗对于整个嵌入?使用值的绝对值将允许计算距离,但我不完全确定这是否是,因为没有更好的术语,好的

在我弄清楚要使用什么范围后将尝试此方法…我甚至如何决定?这似乎并没有改变问题。我仍然在输出中得到NaN。我按照您的说明做了ted…是的,添加
np.abs
肯定会改变嵌入的含义。但我想知道我们是否需要这样做,因为嵌入的内积与自身总是会导致值>=0。为了测试,我在嵌入上使用了
np.abs
。甚至还有一个问题;当计算di时我不应该得到一个数字而不是一个数组吗?输出:
python[[0.-0.36777842-0.13294446…0.2845481-0.33033693[0.26888746 0.0.1716901…0.47692412 0.027391[0.11734442-0.2072754 0…0.36850214-0.17422962.045044]。。。[-0.39771795-0.91176844-0.583537…0.-0.8594358 2.6548653][0.2483108-0.02814436 0.14837784…0.46220255 0.1.8899825]0.]
我错过的一个关键部分是计算距离时的值之和。我想我必须找到一种方法将它们全部相加