繁体   English   中英

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

[英]Use Earth Mover's Distance as loss function in Tensorflow

我想计算两个点云之间的 Earth Mover 距离作为 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,那我该怎么办?

函数EMD.getEMD真的在做计算吗? 似乎是这样,如果我的假设是正确的,那么您就误解了 tensorflow。

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

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

sess.run([ops_to_compute], feed_dict={placeholder_1:input_1, placeholder_2:input_2, ...})

为了使用自定义损失函数,您需要在 tensorflow 中定义损失函数。 如果您曾经在损失函数的定义中使用过 numpy 函数,那么您就知道自己做错了。 您必须使用 tensorflow 操作定义损失函数。

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

您可以使用 sinkhorn 距离的可微张量流实现,它是 EMD 距离的近似值。

https://github.com/jaberkow/TensorFlowSinkhorn

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM