在我的Tensorflow图中,如果矩阵是可逆的,我想对它进行反转。如果它不是不可逆的,那么我想做点其他事情。
我无法找到任何方法来检查矩阵是否可逆以进行类似操作:
is_invertible = tf.is_invertible(mat)
tf.cond(is_invertible, f1, f2)
Tensorflow中是否存在诸如is_invertible
函数之类的东西?
我还考虑过这样一个事实,当我尝试反转不可逆矩阵时,Tensorflow会(并非每次都)引发InvalidArgumentError
,但我无法利用这一点。
答案 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]