【问题标题】:Find rank of a sub-matrix in Tensorflow在 Tensorflow 中查找子矩阵的秩
【发布时间】:2020-02-10 12:55:05
【问题描述】:

我有一个形状为[4, 4, 2, 2] 的矩阵g,我需要在其中找到g[0, 0]g[1, 1]g[2, 2]g[3, 3] 的等级,它们都是2x2 矩阵。我使用了tf.rank 运算符,但它将g 视为单个数组并计算秩并返回整个矩阵的单个值。我需要的是一个2x2 对应g[i, j] 的等级矩阵。 以下是 MWE:

import tensorflow as tf
import numpy as np

a = np.array([
 [[[ 0., 0.], [ 0., 0.]], [[-1., -1.], [-1., -1.]], [[-2., -2.], [-2., -2.]], [[-3., -3.], [-3., -3.]]], 
 [[[ 1., 1.], [ 1., 1.]], [[ 0., 0.], [ 0., 0.]], [[-1., -1.], [-1., -1.]], [[-2., -2.], [-2., -2.]]],
 [[[ 2., 2.], [ 2., 2.]], [[ 1., 1.], [ 1., 1.]], [[ 0., 0.], [ 0., 0.]], [[-1., -1.], [-1., -1.]]],
 [[[ 3., 3.], [ 3., 3.]], [[ 2., 2.], [ 2., 2.]], [[ 1., 1.], [ 1., 1.]], [[ 0., 0.], [ 0., 0.]]]
])
rank = tf.rank(a)  # Returns a number

除了使用for 循环之外,还有什么方法可以得到这个秩矩阵?谢谢。

【问题讨论】:

  • 在 TensorFlow 术语中,rank 只是张量的维数。你指的是rank in the linear algebra sense吗?
  • @jdehesa 我不知道这一点。是的,我的意思是线性代数意义上的等级。谢谢。

标签: python tensorflow machine-learning deep-learning rank


【解决方案1】:

我认为 TensorFlow 中没有任何计算矩阵秩的函数。一种可能性是使用tf.linalg.svd 并计算非零奇异值的数量:

import tensorflow as tf

EPS = 1e-6
a = tf.ones((4, 4, 2, 2), tf.float32)
s = tf.linalg.svd(a, full_matrices=False, compute_uv=False)
r = tf.math.count_nonzero(tf.abs(s) > EPS, axis=-1)
print(r.numpy())
# [[1 1 1 1]
#  [1 1 1 1]
#  [1 1 1 1]
#  [1 1 1 1]]

【讨论】:

  • 如果将a 设置为[[[[ 0., 0.], [ 0., 0.]], [[-1., -1.], [-1., -1.]], [[-2., -2.], [-2., -2.]], [[-3., -3.], [-3., -3.]]], [[[ 1., 1.], [ 1., 1.]], [[ 0., 0.], [ 0., 0.]], [[-1., -1.], [-1., -1.]], [[-2., -2.], [-2., -2.]]], [[[ 2., 2.], [ 2., 2.]], [[ 1., 1.], [ 1., 1.]], [[ 0., 0.], [ 0., 0.]], [[-1., -1.], [-1., -1.]]], [[[ 3., 3.], [ 3., 3.]], [[ 2., 2.], [ 2., 2.]], [[ 1., 1.], [ 1., 1.]], [[ 0., 0.], [ 0., 0.]]]],则r 的对角线上的2 应该是0
  • @learner 抱歉,与EPS 的比较是相反的(您需要的奇异值的数量大于 比 epsilon)。
  • 你能看看this的问题吗?这是一个后续问题,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多