如何检查张量流中矩阵是否可逆?

时间:2019-07-17 10:04:58

标签: python tensorflow linear-algebra inversion

在我的Tensorflow图中,如果矩阵是可逆的,我想对它进行反转。如果它不是不可逆的,那么我想做点其他事情。

我无法找到任何方法来检查矩阵是否可逆以进行类似操作:

is_invertible = tf.is_invertible(mat)
tf.cond(is_invertible, f1, f2)

Tensorflow中是否存在诸如is_invertible函数之类的东西? 我还考虑过这样一个事实,当我尝试反转不可逆矩阵时,Tensorflow会(并非每次都)引发InvalidArgumentError,但我无法利用这一点。

1 个答案:

答案 0 :(得分:1)

Efficient & pythonic check for singular matrix中所建议,您可以检查条件编号。不幸的是,这目前尚未在TensorFlow中实现,但是模拟np.linalg.cond的基本实现并不困难:

import math
import tensorflow as tf

# Based on np.linalg.cond(x, p=None)
def tf_cond(x):
    x = tf.convert_to_tensor(x)
    s = tf.linalg.svd(x, compute_uv=False)
    r = s[..., 0] / s[..., -1]
    # Replace NaNs in r with infinite unless there were NaNs before
    x_nan = tf.reduce_any(tf.is_nan(x), axis=(-2, -1))
    r_nan = tf.is_nan(r)
    r_inf = tf.fill(tf.shape(r), tf.constant(math.inf, r.dtype))
    tf.where(x_nan, r, tf.where(r_nan, r_inf, r))
    return r

def is_invertible(x, epsilon=1e-6):  # Epsilon may be smaller with tf.float64
    x = tf.convert_to_tensor(x)
    eps_inv = tf.cast(1 / epsilon, x.dtype)
    x_cond = tf_cond(x)
    return tf.is_finite(x_cond) & (x_cond < eps_inv)

m = [
    # Invertible matrix
    [[1., 2., 3.],
     [6., 5., 4.],
     [7., 7., 8.]],
    # Non-invertible matrix
    [[1., 2., 3.],
     [6., 5., 4.],
     [7., 7., 7.]],
]
with tf.Graph().as_default(), tf.Session() as sess:
    print(sess.run(is_invertible(m)))
    # [ True False]