Найти ранг подматрицы в Tensorflow - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть матрица g формы [4, 4, 2, 2], где мне нужно найти ранг 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 l oop, есть ли способ получить эту матрицу рангов? Спасибо.

1 Ответ

1 голос
/ 10 февраля 2020

Я не думаю, что в 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]]
...