2017-02-14 41 views
0

在Python 3.X + TensorFlow中,如果我有兩個TF矢量,point_x和point_y(相同的形狀),它們表示一些指針的X和Y座標,我如何找到所有獨特點?在Tensorflow中找到唯一的值對

我能夠一起Theano使用複雜的向量在現實和Y虛部分破解此,與X:

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)對作爲一個更長的float,那麼tf.unique適用於這個1-D張量。最後,按照我們的意願將較長的浮標轉換爲兩個真正的浮標。

注意:這種方法真的很不方便,而且你有患南或無窮的風險或一些奇怪的價值。但機會非常渺茫。

另一個可能的解決方法是,如果您的數據類型是整數,您可以將兩個整數打包成一個整數,就像編譯器在將二維索引轉換爲一維索引時所做的一樣。假設,如果x = [1,2,3,2],y = [0,1,0,1],則可以將x和y壓縮爲x * 10 + y的一個張量(10是足夠大的數字。任何大於max(y)的值都應該工作),然後在此壓縮數組中找到唯一值。

最後,如果你沒有任何理由在TensorFlow中做這件事,那麼最好在外面做,比如說numpy。您可以評估張量,並刪除numpy中的重複值,然後使用這些numpy數組生成新的張量並將其饋送到網絡的其餘部分。

+0

.bitcast需要「type =」而不是「dtype =」,但否則這種破解似乎工作 – scnerd

+0

@scnerd一個很好的結果。我在回答中修改了它。 – soloice