【问题标题】:python tensorflow l2 loss over axispython tensorflow l2轴上的损失
【发布时间】:2019-01-27 13:46:40
【问题描述】:

我正在使用带有 tensorflow 的 python 3 我有一个矩阵,每一行都是一个向量,我想得到一个距离矩阵——即计算机使用l2 norm loss,矩阵中的每个值都是两个向量之间的距离

例如

Dij = l2_distance(M(i,:), Mj(j,:)) 

谢谢

编辑: 这不是重复的of,另一个问题是关于计算矩阵每一行的范数,我需要每行到每一行之间的成对范数距离。

【问题讨论】:

标签: python python-3.x tensorflow linear-algebra


【解决方案1】:

This answer 展示了如何计算向量集合之间的两两差平方和。通过简单地用平方根进行后组合,您就可以达到所需的成对距离:

M = tf.constant([[0, 0], [2, 2], [5, 5]], dtype=tf.float64)
r = tf.reduce_sum(M*M, 1)
r = tf.reshape(r, [-1, 1])
D2 = r - 2*tf.matmul(M, tf.transpose(M)) + tf.transpose(r)
D = tf.sqrt(D2)

with tf.Session() as sess:
    print(sess.run(D))

# [[0.         2.82842712 7.07106781]
#  [2.82842712 0.         4.24264069]
#  [7.07106781 4.24264069 0.        ]]

【讨论】:

  • 你能解释一下这里的数学逻辑吗?是根据 (a-b)^2 公式吗?
  • 是的,还有一点广播。链接的答案解释了发生了什么。
  • 谢谢,您能否添加更多信息,说明为什么它在数学上有效?
  • 嗯,链接的答案中是否有任何尚不清楚的地方?我最终会准确地写出里面的内容。
【解决方案2】:

您可以根据欧几里得距离(L2损失)的公式编写TensorFlow操作。

distance = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(x1, x2))))

样品是

import tensorflow as tf

x1 = tf.constant([1, 2, 3], dtype=tf.float32)
x2 = tf.constant([4, 5, 6], dtype=tf.float32)

distance = tf.sqrt(tf.reduce_sum(tf.square(tf.subtract(x1, x2))))

with tf.Session() as sess:
  print(sess.run(distance))

正如@fuglede 所指出的,如果你想输出成对的距离,那么我们可以使用

tf.sqrt(tf.square(tf.subtract(x1, x2)))

【讨论】:

  • 这只会给你一个数字;如果这就是他们想要的,他们可能会直接使用tf.norm。相反,我想他们想知道如何执行您在 NumPy 中执行的广播,以便一次获得所有成对距离。
  • 如果是这种情况,那么我们可以简单地删除tf.reduce_mean 以输出成对距离。
  • 如果你删除tf.reduce_mean,你得到的只是两个向量之间的元素差异。他们的输入是一个矩阵,他们想要其中的行之间的成对距离,例如结果中的对角线消失了,即等于scipy.spatial.distance.pdist
  • 那会输出什么?一个矩阵,它是每行与其他行之间的成对距离(作为向量)?
  • 您能否提供一个适用于矩阵的示例?如操作中所述,我有一个矩阵,每一行都是一个向量,我需要每个向量与每个其他向量之间的成对距离。例如,一个 32*100 的矩阵将为我们提供一个 32*32 的矩阵。谢谢。
猜你喜欢
  • 2017-01-20
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2018-12-08
  • 2017-04-10
  • 2017-10-12
相关资源
最近更新 更多