2017-11-26 17 views
2

Tensorflowの消失関数として2つのポイントクラウド間のEarth Moverの距離を計算したいとします。Tensorflowの消失関数としてEarth Moverの距離を使用する

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を直接操作することはできないと思うので、どうすればいいですか?

答えて

1

実際に計算するのはEMD.getEMDですか?それは事実のように見えます。私の仮定が正しいなら、あなたはテンソルフローを誤解しています。

Tensorflowの開発は2段階で進行します。操作のグラフを作成するには、通常、このコードをすべてbuild_graph()関数に分けます。この時点ではデータは渡されません。私たちが行う操作だけを定義しています。

第2に、セッションを作成して変数を渡し、テンソルフローに損失などの特定の値を計算するよう依頼します。あなたが実際にカスタム損失関数を使用するためには

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

への呼び出しを使用してtensorflowで計算をやる、あなたはtensorflowで損失関数を定義する必要があります。損失関数の定義でn​​umpy関数を使用したことがあれば、間違ってしまったことを知っています。テンソルフロー演算を使用して損失関数を定義する必要があります。

これは通常非常に些細なことです。一般的には、現在のコードでのnumpy操作を見て、同じテンソルフロー操作を再作成します。

+0

ありがとうございました!私はテンソルフロー操作を再作成しようとします。 –

関連する問題