繁体   English   中英

在Tensorflow中查找唯一的值对

[英]Find unique pairs of values in Tensorflow

在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)]]

显然,没有人实现/注册“独特”操作的复杂版本。 任何想法如何完成此任务?

好吧,这是一个甚至骇客的解决方案:使用位级转换。

如果张量均为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可以用于此一维张量。 最后,根据需要将较长的浮点数转换为两个真正的浮点数。

注意: 此方法确实很hacky,并且有遭受Nan或Infinity或某些奇怪值的风险。 但是机会确实很小。

另一个可能的解决方法是,如果您的数据类型是整数,则可以将两个整数打包为一个整数,就像编译器将2维索引转换为1维索引时所做的那样。 假设,如果x = [1、2、3、2],y = [0、1、0、1],则可以通过x * 10 + y将x和y压缩为一个张量(10是一个足够大的数字。任何大于max(y)的值都可以使用),然后在此压缩数组中找到唯一的值。

最后,如果您没有任何理由在TensorFlow内部进行此操作,那么最好在numpy外部进行操作。 您可以评估张量,并删除numpy中的重复值,然后使用这些numpy数组生成新的张量并将其馈送到网络的其余部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM