2017-02-14 8 views
0

Python 3.X + TensorFlowでは、いくつかのポインタのX座標とY座標を表す2つのTFベクトル、point_xとpoint_y(同じ形)がある場合、ユニークなポイント?Tensorflowでユニークな値のペアを見つける

私は虚数部分で現実とYでXと、複雑なベクターを用いてTheanoで一緒にこれをハックすることができました:

complex_points = point_x + point_y * 1j 
unique_points, idxs, groups = T.extra_ops.Unique(True, True, False)(complex_points) 

私がしようとしているTFと同等である:

complex_points = tf.complex(point_x, point_y) 
unique_points, groups = tf.unique(complex_points) 

TensorFlowのようなもので失敗します。明らかに、誰の登録/実行されなかっ

InvalidArgumentError: No OpKernel was registered to support Op 'Unique' with these attrs. 
... # supported types include the float/int/string types, no complex types 
[[Node: Unique_1 = Unique[T=DT_COMPLEX64, out_idx=DT_INT32](Complex_1)]] 

「ユニークな」オペレーションの複雑なバージョン。どのようにこのタスクを達成するための任意のアイデア?

答えて

2

まあ、ここではハッカーのソリューションがあります。ビットレベルのキャストを使用します。

あなたはテンソル場合は、使用できるタイプtf.float32のすべて、以下のとおりです。

xy = tf.transpose(tf.pack([point_x, point_y])) 
xy64 = tf.bitcast(xy, type=tf.float64) 
unique64, idx = tf.unique(xy64) 
unique_points = tf.bitcast(unique64, type=tf.float32) 

この背後にある原理は、xとyはともに座標入れてTensorFlowのように(x、y)のペアを扱うようにすることですより長い浮動小数点数であれば、この1-Dテンソルではtf.uniqueが動作します。最後に、長いフロートを2つの本物のフロートに変換します。

注:この方法は本当にハッキーです.Nanや無限大、奇妙な値に悩まされる危険性があります。しかし、チャンスは本当にスリムです。

データ型が整数の場合、2-dインデックスを1-dインデックスに変換するときにコンパイラが行うように、2つの整数を1つにパックすることができます。 x = [1、2、3、2]、y = [0,1,0,1]の場合、xとyをx * 10 + yで1つのテンソルに圧縮することができます。 max(y)より大きい値があれば)、この圧縮された配列内で一意の値を見つける。

最後に、TensorFlowの内部でこれを行う理由がない場合は、たとえばnumpyのように外部で行う方がよい場合があります。テンソルを評価し、numpyで重複した値を削除し、次にこれらのnumpy配列を使用して新しいテンソルを生成し、残りのネットワークにフィードすることができます。

+0

.bitcastは "dtype ="の代わりに "type ="を使いますが、そうでなければこのハックはうまくいくようです – scnerd

+0

@scnerdいいキャッチです。私は私の答えでそれを修正しました。 – soloice

関連する問題