我想创建一个n*n
的对称矩阵,并在TensorFlow中训练这个矩阵。实际上,我应该只训练(n+1)*n/2
个参数。我该怎么做?
我看到一些以前的帖子建议执行以下操作:
X = tf.Variable(tf.random_uniform([d,d], minval=-.1, maxval=.1, dtype=tf.float64))
X_symm = 0.5 * (X + tf.transpose(X))
但是,这意味着我必须培训n*n
个变量,而不是n*(n+1)/2
变量。
即使没有实现这一目标的功能,一段自编代码也会有所帮助!
谢谢!
答案 0 :(得分:4)
你可以使用tf.matrix_band_part(input, 0, -1)
从正方形创建一个上三角矩阵,所以这段代码可以让你在n(n+1)/2
变量上训练虽然它有你创建 n*n
:
X = tf.Variable(tf.random_uniform([d,d], minval=-.1, maxval=.1, dtype=tf.float64))
X_upper = tf.matrix_band_part(X, 0, -1)
X_symm = 0.5 * (X_upper + tf.transpose(X_upper))
答案 1 :(得分:0)
请参阅gdelab的答案:在Tensorflow 2.x中,您必须使用以下代码。
X_upper = tf.linalg.band_part(X, 0, -1)