如何仅通过张量操作在张量流图中获取掩码

时间:2019-03-05 21:25:54

标签: python tensorflow tensor

我有两个张量,其中包含两组向量d1和d2。 d1和d2都包含5个二维矢量[d1和d2在训练循环中正在变化]

import tensorflow as tf
import numpy as np
# random initialize
d1_np = np.random.rand(5,2) 
d2_np = np.random.rand(5,2) 

d1 = tf.Variable(initial_value = d1_np, dtype=tf.float32)
d2 = tf.Variable(initial_value = d2_np, dtype=tf.float32)

然后我计算它们的距离并通过cross_distance得到它们的交叉距离矩阵

dist_1_2 = cross_distance(d1, d2)  

因此它会生成大小为5x5的矩阵(对角线值设置为非常大的值)。

然后对于d1中的每个向量,我得到d2中与它最接近的向量的索引

ind_min = tf.argmin(dist_1_2,axis=1)

ind_min在运行期间获取[2 0 0 1 0]之类的值

然后我使用tf.unique在ind_min中获取唯一索引

yv,idx = tf.unique(ind_min)

现在yv变为[2 0 1]。我想设置一个遮罩,看看d2中的对应向量是否是d1中某些向量的壁橱向量。

mask = tf.cast(tf.ones(5),tf.bool)

现在,我希望将yv中的那些索引的mask值设置为零。 我尝试过:

mask[yv] = 0

(“张量”对象不支持项目分配) 和

for ind in tf.unstack(yv):
    mask[yv] = 0

(无法从形状(?,)推断num) 它不起作用。

点是d1,而d2在某些训练过程中正在变化,因此ind_min不是固定的,而是随训练循环而变化。

有没有办法动态获得这个面具?

1 个答案:

答案 0 :(得分:1)

创建索引的一次性编码并沿第一个维度进行添加将为您提供掩码。即

mask = tf.reduce_sum(tf.one_hot(idx, 5), axis=0)

可以用d1.shape[0]替换掩码大小(硬编码5)。