我想计算地球移动器在两个点云之间的距离作为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,所以我该怎么做?
答案 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中