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不是固定的,而是随训练循环而变化。
有没有办法动态获得这个面具?
答案 0 :(得分:1)
创建索引的一次性编码并沿第一个维度进行添加将为您提供掩码。即
mask = tf.reduce_sum(tf.one_hot(idx, 5), axis=0)
可以用d1.shape[0]
替换掩码大小(硬编码5)。