在Python 3.X + TensorFlow中,如果我有两个TF矢量,point_x和point_y(相同形状)代表一些指针的X和Y坐标,我如何找到所有唯一点?
我能够使用一个复杂的向量在Theano中一起破解它,其中X在真实中,Y在虚部中:
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)]]
显然,没有人实施/注册过"独特"的复杂版本。运。知道如何完成这项任务吗?
答案 0 :(得分:3)
嗯,这是一个甚至是黑客的解决方案:使用位级转换。
如果你的张量都是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)对视为更长的浮点数,然后tf.unique适用于这个1-D张量。最后,根据需要将较长的浮点数转换为两个真正的浮点数。
注意:这种方法非常黑客,你有遭受楠或无限或某些奇怪价值的风险。但机会真的很渺茫。
另一个可能的解决方法是,如果您的数据类型是整数,则可以将两个整数打包成一个整数,就像编译器将二维索引转换为一维索引时所做的那样。比方说,如果x = [1,2,3,2],y = [0,1,0,1],你可以用x * 10 + y将x和y压缩成一个张量(10是一个足够大的数字。任何大于max(y)的值都应该有效,然后在这个压缩数组中找到唯一值。
最后,如果你没有任何理由在TensorFlow中做到这一点,那么最好在外面做,比如说,在numpy中。您可以评估张量,并删除numpy中的重复值,然后使用这些numpy数组生成新的张量并将其提供给网络的其余部分。