scn*_*erd 1 python unique 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)
Run Code Online (Sandbox Code Playgroud)
我正在尝试的 TF 等效项是:
complex_points = tf.complex(point_x, point_y)
unique_points, groups = tf.unique(complex_points)
Run Code Online (Sandbox Code Playgroud)
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)]]
Run Code Online (Sandbox Code Playgroud)
显然,没有人实现/注册了“独特”操作的复杂版本。知道如何完成这项任务吗?
好吧,这是一个甚至黑客的解决方案:使用位级转换。
如果你的张量都是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)
Run Code Online (Sandbox Code Playgroud)
这背后的原理是将 x 和 y 坐标放在一起,让 TensorFlow 将 (x, y) 对视为更长的浮点数,然后 tf.unique 适用于这个一维张量。最后,根据我们的需要,将较长的浮子转换为两个真正的浮子。
注意:这种方法确实很hacky,并且您有遭受 Nan 或无穷大或一些奇怪值的风险。但机会确实很小。
另一种可能的解决方法是,如果您的数据类型是整数,则可以将两个整数打包为一个,就像编译器将二维索引转换为一维索引时所做的那样。假设,如果 x = [1, 2, 3, 2],y = [0, 1, 0, 1],则可以通过 x*10+y 将 x 和 y 压缩为一个张量(10 是一个足够大的数字。任何大于 max(y) 的值都可以工作),然后在此压缩数组中查找唯一值。
最后,如果您没有任何理由在 TensorFlow 内部执行此操作,那么最好在外部执行此操作,例如在 numpy 中。您可以评估张量,并删除 numpy 中的重复值,然后使用这些 numpy 数组生成新的张量并馈送到网络的其余部分。
| 归档时间: |
|
| 查看次数: |
1671 次 |
| 最近记录: |