在Tensorflow中使用Earth Mover的距离作为损失函数

时间:2017-11-26 16:22:15

标签: python numpy tensorflow

我想计算地球移动器在两个点云之间的距离作为Tensorflow中的损失函数。

pointclouds1 = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3))
pointclouds2 = tf.placeholder(tf.float32, shape=(batch_size, num_point, 3))
//'3' means xyz coordinate

def get_loss(pointclouds1, pointclouds2):
    loss = EMD.getEMD(pointclouds1,pointclouds2)
    return loss

不幸的是,我收到错误:

File "F:\pointclouds\utils\EMD.py", line 71, in groundDistance
return np.linalg.norm(x1 - x2, norm)
File "C:\Users\xu\Anaconda3\lib\site-packages\numpy\linalg\linalg.py", line 2257, in norm
raise ValueError("Improper number of dimensions to norm.")
ValueError: Improper number of dimensions to norm.

EMD.py来自https://github.com/chalmersgit/EMD/blob/master/EMD.py

但我可以使用该文件直接操作numpy数组:

>>python EMD.py
EMD
We got: 160.542759771
C example got 160.54277
Success

我想这意味着我无法直接操作Tensor,所以我该怎么做?

2 个答案:

答案 0 :(得分:1)

函数EMD.getEMD实际上是在进行计算吗?似乎是这种情况,如果我的假设是正确的,那么你就会误解张量流。

Tensorflow开发分两个阶段进行,首先建立一个操作图,我们通常将所有这些代码分成build_graph()函数。此时没有传入数据,我们只定义了我们将要执行的操作。

其次,您创建一个会话,传入变量,并要求tensorflow计算某些值,例如损失。您实际上将使用对

的调用在tensorflow中进行计算
sess.run([ops_to_compute], feed_dict={placeholder_1:input_1, placeholder_2:input_2, ...})

为了使用自定义损失函数,您需要在张量流中定义损失函数。如果你在损失函数的定义中使用numpy函数,你知道你做错了。您必须使用tensorflow操作定义损失函数。

这样做通常很简单。您通常只需查看当前代码中的numpy操作并重新创建相同的tensorflow操作。

答案 1 :(得分:0)

您可以使用EMD的python实现,例如OpenCV或PyEMD。然后您可以通过tf.py_function(https://www.tensorflow.org/api_docs/python/tf/py_function

将此函数的输出集成到tensorflow中