【发布时间】:2017-10-20 09:22:49
【问题描述】:
我想在我的神经网络中使用余弦相似度,而不是标准的点积。
我查看了dot product 和cosine similarity。
在上面的示例中,他们使用
a = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_a")
b = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_b")
normalize_a = tf.nn.l2_normalize(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_similarity,feed_dict={a:[1,2,3],b:[2,4,6]})
但是,我尝试过自己的方式
x = tf.placeholder(tf.float32, [None, 3], name = 'x') # input has 3 features
w1 = tf.placeholder(tf.float32, [10, 3], name = 'w1') # 10 nodes in the first hidden layer
cos_sim = tf.divide(tf.matmul(x, w1), tf.multiply(tf.norm(x), tf.norm(w1)))
with tf.Session() as 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) )})
我的方法错了吗?另外,矩阵乘法中发生了什么?我们实际上是在为不同样本的输入(在一个特征内)乘以一个节点的权重吗?
【问题讨论】:
-
另外,我经常用第一种方法得到形状错误,有时用第二种方法
-
它认为
W具有形状(number_nodes,number_features),而输入矩阵X具有形状(number_samples,number_features)。但很明显,矩阵乘法没有意义!所以实际上我们没有 WX^T 而不是 WX? -
因为我认为我们使用了 w_{ij} ^ L 其中 i 是层 L+1 中的节点编号,j 是层 L 中的节点编号。因此,如果我们要做 WX,那么我们会将传入隐藏层中一个节点的所有权重与 X 中 ONE 特征的所有样本相乘......这没有意义。
标签: python machine-learning tensorflow neural-network deep-learning