Tensorflow/keras-在tensor中查找唯一元素的位置

Tensorflow/keras-在tensor中查找唯一元素的位置,tensorflow,keras,Tensorflow,Keras,我试图找到二维张量中所有不同值的位置。假设我有以下张量: spMap4x4 = tf.Variable([[1, 2, 2, 2], [1, 1, 2, 3], [1, 3, 3, 3], [1, 1, 3, 3]]) 我想找到元素的位置等于1,然后元素的位置等于2,最后元素的位置等于3,而事先不知道这些值 我的想法是在将spMap4x4重塑为一维张量后使用“” spMapFlatten = tf.reshape(spMap4x4, [-1]) y, idx, count = tf.uniqu

我试图找到二维张量中所有不同值的位置。假设我有以下张量:

spMap4x4 = tf.Variable([[1, 2, 2, 2], [1, 1, 2, 3], [1, 3, 3, 3], [1, 1, 3, 3]])
我想找到元素的位置等于1,然后元素的位置等于2,最后元素的位置等于3,而事先不知道这些值

我的想法是在将spMap4x4重塑为一维张量后使用“”

spMapFlatten = tf.reshape(spMap4x4, [-1])
y, idx, count = tf.unique_with_counts(spMapFlatten)
然后,使用“”获取所需的位置。例如:

a = tf.where(tf.equal(spMap4x4, y[0])
K.eval(a) 
这里给出:

a = [[0 0]
     [1 0]
     [1 1]
     [2 0]
     [3 0]
     [3 1]]

问题是,在不知道这些值是什么的情况下,如何对y中的所有不同值执行该操作?这将包含在keras层中,因此,我需要一个通用解决方案。

想到的解决方案是使用,但它要求您知道可能拥有的最大分区数(即输入张量中唯一值的最大数目):

将tensorflow导入为tf
spMap4x4=tf.常数([[1,2,2,2],[1,1,2,3],[1,3,3],[1,1,3,3])
#要求:知道张量可能具有的不同值(分区)的最大数量
最大差值=4
spMap4x4_shape=tf.shape(spMap4x4)
#获取唯一值及其反向索引/分区:
unique\u val,unique\u idx=tf.unique(tf.reformate(spMap4x4,[-1]))
unique_idx=tf.重塑(unique_idx,spMap4x4_形状)
#建立索引矩阵:
idx_cols,idx_rows=tf.meshgrid(tf.range(spMap4x4_形状[0]),tf.range(spMap4x4_形状[1]))
idx_grid=tf.stack([idx_行,idx列],-1)
#根据唯一值的分区对索引矩阵进行分区:
分区的分区=tf.动态分区(idx网格、唯一分区、num分区=最大值)
使用tf.Session()作为sess:
打印(sess.run(partitioned_idx))
#[数组([[0,0],
#         [1, 0],
#         [1, 1],
#         [2, 0],
#         [3, 0],
#[3,1]],dtype=int32),
#数组([[0,1],
#         [0, 2],
#         [0, 3],
#[1,2]],dtype=int32),
#数组([[1,3],
#         [2, 1],
#         [2, 2],
#         [2, 3],
#         [3, 2],
#[3,3]],dtype=int32),
#数组([],形状=(0,2),数据类型=int32)]

输入的排序是否使数字总是在增加?例如,@nuric,不,数字并不总是在增加,它可以是随机的。谢谢@Aldream,我想我可以事先计算不同值的数量并将其提供给图层。这不是一个完美的解决方案,但我现在想不出另一个(例如,
tf.while\u loop()
tf.map\u fn()
无法使用,因为每值张量的输出位置将具有不同的形状……)。