Python 我的余弦相似性有什么问题?张量流

Python 我的余弦相似性有什么问题?张量流,python,machine-learning,tensorflow,neural-network,deep-learning,Python,Machine Learning,Tensorflow,Neural Network,Deep Learning,我想在我的神经网络中使用余弦相似性,而不是标准的点积 我已经看过了和 在上面的例子中,他们使用 a=tf.placeholder(tf.float32,shape=[None],name=“input\u placeholder\u a”) b=tf.placeholder(tf.float32,shape=[None],name=“input\u placeholder\u b”) 归一化a=tf.nn.l2\u归一化(a,0) normalize_b=tf.nn.l2_normalize(b

我想在我的神经网络中使用余弦相似性,而不是标准的点积

我已经看过了和

在上面的例子中,他们使用

a=tf.placeholder(tf.float32,shape=[None],name=“input\u placeholder\u a”)
b=tf.placeholder(tf.float32,shape=[None],name=“input\u placeholder\u b”)
归一化a=tf.nn.l2\u归一化(a,0)
normalize_b=tf.nn.l2_normalize(b,0)
cos_similarity=tf.reduce_sum(tf.multiply(normalize_a,normalize_b))
sess=tf.Session()
cos_sim=sess.run(cos_相似性,feed_dict={a:[1,2,3],b:[2,4,6]})
然而,我试着用我自己的方式去做

x=tf.placeholder(tf.float32,[None,3],name='x')#输入有3个特性
w1=tf.placeholder(tf.float32[10,3],name='w1')#第一个隐藏层中的10个节点
cos_sim=tf.divide(tf.matmul(x,w1),tf.multiply(tf.norm(x),tf.norm(w1)))
使用tf.Session()作为sess:
sess.run(cos_sim,feed_dict={x=np.array([[1,2,3],[4,5,6],[7,8,9],w1:np.random.uniform(0,1,size=(10,3)))

我的方法错了吗?还有,矩阵乘法中发生了什么?我们实际上是在为不同样本的输入(在一个特征内)乘以一个节点的权重吗?

在您的示例中,维度有一个问题,我认为
w1
应该有一个
[3,10]
shape。但是忽略这些小细节,您的实现似乎是正确的

尽管如此,我还是建议使用一种更接近顶部示例的方法,即使用
tf.nn.l2_normalize
,因为它保证返回与输入相同的形状,因此可以灵活地选择要进行规格化的维度。此外,当分母接近零时,它可以提供数值稳定性,并且可能会稍微更高一些e高效

a = tf.placeholder(tf.float32, shape=[None, 3], name="input_placeholder_a")
b = tf.placeholder(tf.float32, shape=[3, 10], name="input_placeholder_b")

normalize_a = tf.nn.l2_normalize(a, dim=0)
normalize_b = tf.nn.l2_normalize(b, dim=0)
cos_similarity=tf.matmul(normalize_a, normalize_b)

sess=tf.Session()
cos_sim=sess.run(cos_similarity,feed_dict={
  a: np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
  b: np.arange(30).reshape([3, 10])
})
print cos_sim

它给出了与您相同的结果。

此外,我经常在第一种方法中得到形状错误,有时在第二种方法中,它认为
W
具有形状(编号节点,编号特征),而输入矩阵
X
具有形状(编号样本,编号特征)但是很明显,矩阵乘法没有意义!所以实际上我们没有WX^T而不是WX?因为我认为我们使用了w{ij}^L,其中i是层L+1中的节点号,j是层L中的节点号。因此,如果我们要做WX,那么我们会将进入隐藏层中一个节点的所有权重乘以X中一个特征的所有样本……这没有意义。为什么
dim=0
?我刚才做的与上面的示例相同。您可以设置
dim=[0,1]
跨两个维度进行规范化。通常,由您决定规范化的最佳方向。那么这是否意味着如果我们有
a=np.array([[1,2,3],[4,5,6]])
那么它将做:1)找到跨维度0的平均值:(1+2+3)/3=2和(4+5+6)/3=5。2)找到标准偏差std1=std({1,2,3}),std2=std({4,5,6})。3)计算([1,2,3]-2)/std1和([4,5,6]-5)/sd2?你混合了高斯归一化和L2范数。后者使用平方和进行操作。这里的实现是:哦,好的!使用
dim=0
它获取“垂直”向量的范数,然后将该向量除以其范数!