繁体   English   中英

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

[英]How to get a mask in the tensorflow graph by only tensor operations

我有两个张量,其中包含两组向量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不是固定的,而是随训练循环而变化。

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

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

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

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

暂无
暂无

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

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