-1

Using TensorFlow in python, I have the following code:

sess = tf.InteractiveSession() # so I can eval()
t1 = tf.convert_to_tensor([[1,4,5],[34,5,1],[53,1,4]],dtype=tensorflow.float32)
t1.eval()
OUTPUT>> array([[  1.,   4.,   5.],
       [ 34.,   5.,   1.],
       [ 53.,   1.,   4.]], dtype=float32)
# so far, so good!

t1_inverse = tf.matrix_inverse(t1)
t1_inverse.eval()
OUTPUT>> array([[-0.01294278,  0.00749319,  0.01430518],
   [ 0.05653951,  0.17779292, -0.11512262],
   [ 0.15735695, -0.14373296,  0.08923706]], dtype=float32)
# I'm not a math whiz but this looks like an inverted matrix to me!

(t1*t1_inverse).eval() # should yield identity matrix, but.. 
OUTPUT>> array([[-0.01294278,  0.02997275,  0.07152588],
       [ 1.92234337,  0.88896459, -0.11512262],
       [ 8.33991814, -0.14373296,  0.35694823]], dtype=float32)

So my question is, why does matrix t1 multiplied by its inverse not yield the identity matrix, or [[1,0,0],[0,1,0],[0,0,1]] ?

vannorman
  • 144
  • 1
  • 12

2 Answers2

1

Here t1*t1_inverse is element-wise multiplication, you need to use tf.matmul

idenity_mat = tf.matmul(t1, t1_inverse)
sess.run(identity_mat)   

# Results: array([[  1.00000000e+00,   5.96046448e-08,   0.00000000e+00],
                  [  0.00000000e+00,   1.00000000e+00,  -6.70552254e-08],
                  [ 0.00000000e+00,   5.96046448e-08,   9.99999881e-01]], dtype=float32) 
Ishant Mrinal
  • 4,898
  • 3
  • 29
  • 47
1

You're using the normal multiplication sign in your code:

(t1*t1_inverse).eval()

Which i assume will do a broadcast multiplication

What you want to use is matmul

tf.matmul(t1,t1_inverse)
omu_negru
  • 4,642
  • 4
  • 27
  • 38
  • Yes, it appears that t1*t2 (or equivalently tf.matrix_multiply(t1,t2)) is a broadcast multiplication. Thanks! – vannorman Aug 17 '17 at 19:56