Python 可变项tensorflow中的相关矩阵
在tensorflow中,我需要一个k×k对称矩阵,其中对角线为常数1,非对角线项为变量 i、 e: 然后: 是否有一些straighforward tensorflow实现让我从Python 可变项tensorflow中的相关矩阵,python,tensorflow,Python,Tensorflow,在tensorflow中,我需要一个k×k对称矩阵,其中对角线为常数1,非对角线项为变量 i、 e: 然后: 是否有一些straighforward tensorflow实现让我从k和a到Rho?求解相关矩阵是很常见的,所以我怀疑在tf中应该存在一个严格的实现 谢谢 一项提案 按照上面关于k=3的逻辑,从a得到一个严格的上三角矩阵U就足够了,然后Rho就是: U = tf.[strictly_upper_triangular](a) Rho = tf.eye(k) + U + tf.transp
k
和a
到Rho
?求解相关矩阵是很常见的,所以我怀疑在tf中应该存在一个严格的实现
谢谢
一项提案
按照上面关于k=3
的逻辑,从a
得到一个严格的上三角矩阵U
就足够了,然后Rho
就是:
U = tf.[strictly_upper_triangular](a)
Rho = tf.eye(k) + U + tf.transpose(U)
是否有这样一个函数作为
[严格意义上的上三角]
?这里有一种可能性:
import tensorflow as tf
import numpy as np
k = 5
# Using a constant instead now for testing
#a = tf.Variable(1.0 * tf.ones([(k * (k - 1)) // 2, 1]))
a = 10 * tf.range((k * (k - 1)) // 2, dtype=tf.float32) + 10
# Make indices and mask
idx = np.zeros((k, k), dtype=int)
mask = np.zeros((k, k), dtype=bool)
triu_idx = np.triu_indices(k, 1)
idx[triu_idx] = np.arange((k * (k - 1)) // 2)
mask[triu_idx] = True
# Make upper triangular matrix
u = tf.where(mask, tf.gather(a, idx), tf.zeros((k, k), dtype=a.dtype))
# Final matrix
Rho = tf.eye(k, dtype=u.dtype) + u + tf.transpose(u)
print(sess.run(Rho))
输出:
[[ 1. 10. 20. 30. 40.]
[ 10. 1. 50. 60. 70.]
[ 20. 50. 1. 80. 90.]
[ 30. 60. 80. 1. 100.]
[ 40. 70. 90. 100. 1.]]
缺点是在图形构造时必须知道
k
,因为索引和掩码矩阵是用NumPy构造的。对于较大的k
,如何从a
形成Rho
?如何形成“Rho”实际上没有什么区别,但它的结构应该基于k
。我举了一个例子,其中非对角线先按行填充,然后按列填充,下半部分是等价的。因此,应该有一些东西可以从a
,将其称为U
,然后我们可以做Rho=tf.eye(k)+U+tf.transpose(U)
是k
在图形构建时固定且已知的还是TensorFlow中间值?(也就是说,我可以使用k
来构建一个NumPy矩阵,在图中用作常量吗?k
在构建时就已经知道了。我提供了一个更新,但它似乎仍然不起作用。这到底是怎么回事?这只适用于k=3
基本上,a
的大小将是k*(k-1)/2
当矩阵的大小是[k,k]
@AOK对,现在我认为是固定的。顺便说一下,k*(k-1)总是可以被2整除,所以不需要/
@AOK是的,你说得对,只是在Python3中/
总是返回一个浮点,因此np.arange
将返回一个浮点数组(在本例中这并不重要,因为它被强制转换为整数,但无论如何)。
import tensorflow as tf
import numpy as np
k = 5
# Using a constant instead now for testing
#a = tf.Variable(1.0 * tf.ones([(k * (k - 1)) // 2, 1]))
a = 10 * tf.range((k * (k - 1)) // 2, dtype=tf.float32) + 10
# Make indices and mask
idx = np.zeros((k, k), dtype=int)
mask = np.zeros((k, k), dtype=bool)
triu_idx = np.triu_indices(k, 1)
idx[triu_idx] = np.arange((k * (k - 1)) // 2)
mask[triu_idx] = True
# Make upper triangular matrix
u = tf.where(mask, tf.gather(a, idx), tf.zeros((k, k), dtype=a.dtype))
# Final matrix
Rho = tf.eye(k, dtype=u.dtype) + u + tf.transpose(u)
print(sess.run(Rho))
[[ 1. 10. 20. 30. 40.]
[ 10. 1. 50. 60. 70.]
[ 20. 50. 1. 80. 90.]
[ 30. 60. 80. 1. 100.]
[ 40. 70. 90. 100. 1.]]