[英]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.