簡體   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