将张量的值传递到2维张量的下梯形部分

时间:2019-07-31 15:29:10

标签: python r tensorflow keras

我是 Python Tensorflow 的新手,并且正在使用 Python 进行项目。假设我有向量 X

  

X = [x1,x2,x3]

,并希望将其转换为下三角矩阵 A ,其中主对角线为一个,

  

A = [[1,0,0],[x1,1,0],[x2,x3,1]]。

R 中,我使用了以下简单代码:

A<-diag(3)
A[lower.tri(A)] <- X.

在我的项目中, X 是张量,作为 Tensorflow 中神经网络的输出。

X <- layer_dense(hidden layer, dec_dim)

所以,我想尽可能在​​Keras或Tensorflow中这样做。例如在Keras中,

from keras import backend as K
 A= K.eye(3)      

但是我在Tensorflow或Keras中找不到第二条命令的解决方案。由于运行时间长,我不想在这里使用 For 循环。有什么简短的解决方案吗?你有什么想法吗?预先感谢。

1 个答案:

答案 0 :(得分:2)

您需要获取X的所有索引并将其应用于A

from keras import backend as K
import tensorflow as tf

n = 3
X = tf.constant([1,2,3],tf.float32)
A = K.eye(n)

column,row = tf.meshgrid(tf.range(n),tf.range(n))
indices = tf.where(tf.less(column,row))
# [[1 0]
#  [2 0]
#  [2 1]]

A = tf.scatter_nd(indices,X,(n,n)) + A
# if your lower triangular part of A not equal 0, you can use follow code.
# tf.matrix_band_part(A, 0, -1)==> Upper triangular part
# A = tf.scatter_nd(indices,X,(n,n)) + tf.matrix_band_part(A, 0, -1)

print(K.eval(A))
# [[1. 0. 0.]
#  [1. 1. 0.]
#  [2. 3. 1.]]