numpy Tensorflow -从两个不同Tensor中提取的特定值构建Tensor

wz3gfoph  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(194)

我尝试使用两个不同Tensor的值和一个二维索引数组来构造一个Tensor,其方式与TensorFlow自差分兼容。
第一步,我想提取形状为(n,n)的TensorD中的元素,这些元素的值与另一Tensora中的元素的值相同。

a = []
for i in range(len(f)):
    a.append(tf.where(tf.experimental.numpy.isclose(f[I], D, atol=1e-6))[0])
P_x = tf.gather(D,a)

在append步骤中,我只使用第一个值相等的示例,因为我感兴趣的函数与这个选择无关。我需要使用isclose,因为这两个数组是float32数组,彼此并不完全相等。
第二步,把P_xP_y = tf.gather(g, indices)组合起来,构造一个TensorP,假设P_xP_y都是(n, )的形状,

P = [[P_x[0], P_y[0]],[P_x[1], P_y[1]], ..., [P_x[n], P_y[n]] ]

我对TensorFlow还很陌生,所以尽管浏览了文档,我还是没有找到使用gather、scatter等来完成所有这些操作的方法,而这似乎是使autodiff工作所必需的。当我使用循环和其他方法时,我得到的梯度=无。

2hh7jdfx

2hh7jdfx1#

第一步,您可以使用broadcasting查找最接近的匹配,从而将循环简化为矩阵运算。

indices = tf.reduce_sum(tf.math.abs(D[:,None] - a), 2)     
#numpy is_close

tf.gather(D,tf.where(indices < 1e-6)[:,0])

示例:

D = tf.random.normal(shape=(5,3))
a = tf.concat([tf.random.normal(shape=(2,3)), D[:2],], axis=0)

#Here a last 2 rows of `a` are made same as first two rows of D.
#D is array([[ 0.6221494 ,  0.39071774,  0.5728211 ],
   [ 0.926828  ,  0.8460992 ,  0.08634651],
   [-0.39511812, -0.02012417,  1.0490925 ],
   [-0.31207308,  0.41652176,  0.85152763],
   [-1.27271   , -0.09542792, -0.16090107]]
#a is array([[ 0.9826471 ,  0.25055575, -0.4920534 ],
   [-0.3222343 ,  0.91883016,  1.2904693 ],
   [ 0.6221494 ,  0.39071774,  0.5728211 ],
   [ 0.926828  ,  0.8460992 ,  0.08634651]]

numpy.is()操作

indices = tf.reduce_sum(tf.math.abs(D[:,None] - a), 2)  
#this compares each row of D with each row of a. So we get a (5,4) matrix for the above example.

D凑近一凑:

tf.gather(D,tf.where(indices < 1e-6)[:,0])
#output
array([[0.6221494 , 0.39071774, 0.5728211 ],
       [0.926828  , 0.8460992 , 0.08634651]],

相关问题