Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 可变项tensorflow中的相关矩阵_Python_Tensorflow - Fatal编程技术网

Python 可变项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

在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.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.]]