使用矩阵

理解TensorFlow如何使用(或者说如何处理)矩阵,对于理解计算图(computational graphs)如何处理数据流,是非常重要的。

 

准备工作

 

很多算法依赖矩阵操作,Tensorflow给我们提供了易于使用的方法以便进行这种矩阵计算。对于以下所有的例子,我们可以通过运行以下代码来创建图会话(graph session):

import tensorflow as tf
    sess = tf.Session()

 

如何做...

 

1.创建矩阵 正如前面的章节对“张量”(tensors)描述的那样,我们可以从 numpy 阵列(numpy arrays)或者嵌套的列表(nested lists)来乌创建二维矩阵,也可以使用张量创建函数并给此类的函数指定一个二维类型(shape)。这样的函数有 zeros(), ones(), truncated_normal()等等。Tensorflow也允许我们使用函数 diag() 从一维数组或者列表来创建对角矩阵,比如:

identity_matrix = tf.diag([1.0, 1.0, 1.0])
A = tf.truncated_normal([2, 3])
B = tf.fill([2, 3], 5.0)
C = tf.random_uniform([3, 2])
D = tf.convert_to_tensor(np.array([[1., 2., 3.], [-3., -7., -1.], [0., 5., -2.]]))

可以通过运行以下代码看上述结果

print(sess.run(identity_matrix))
'''
[[ 1. 0. 0.]
 [ 0. 1. 0.]
 [ 0. 0. 1.]]
'''
print(sess.run(A))
'''
[[ 0.96751703  0.11397751  -0.3438891 ]
 [-0.10132604 -0.8432678    0.29810596]]
'''
print(sess.run(B))
'''
[[ 5.  5.  5.]
 [ 5.  5.  5.]]
'''
print(sess.run(C))
'''
[[ 0.33184157  0.08907614]
 [ 0.53189191  0.67605299]
 [ 0.95889051  0.67061249]]
'''
print(sess.run(D))
'''
[[ 1.  2.  3.]
 [-3. -7. -1.]
 [ 0.  5. -2.]]
'''

要注意的是,如果我们再次运行 sess.run(C), 会再次初始化随机变量,最后会有不同的随机值。

2.使用以下函数进行加减运算:

print(sess.run(A+B))
'''
[[ 4.61596632  5.39771316  4.4325695 ]
 [ 3.26792376  5.14477345  4.98265553]]
'''
print(sess.run(B-B))
'''
[[ 0.  0.  0.]
 [ 0.  0.  0.]]
'''
print(sess.run(tf.matmul(B, identity_matrix)))
'''
[[ 5.  5.  5.]
 [ 5.  5.  5.]]
'''

3.另外,函数 matmul() 可以通过参数指定在相乘之前是否对矩阵进行转置,或者指定每个矩阵是否为稀疏矩阵。

4.转置运算如下:

print(sess.run(tf.transpose(C)))
'''
[[ 0.67124544  0.26766731  0.99068872]
 [ 0.25006068  0.86560275  0.58411312]]
'''

5.再次值得一提的是,重新初始化会给出和之前相比不同的值。

6.计算行列式和逆矩阵,使用下述函数:

print(sess.run(tf.matrix_determinant(D)))
'''
-38.0
'''
print(sess.run(tf.matrix_inverse(D)))
'''
[[-0.5          -0.5        -0.5       ]
 [ 0.15789474    0.05263158  0.21052632]
 [ 0.39473684    0.13157894  0.02631579]]
'''

7.分解,乔列斯基分解:

print(sess.run(tf.cholesky(identity_matrix)))
'''
[[ 1.  0.  1.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]
'''

8.求特征值及特征向量:

print(sess.run(tf.self_adjoint_eig(D)))
'''
[[-10.65907521    -0.22750691    2.88658212]
 [  0.21749542     0.63250104   -0.74339638]
 [  0.84526515     0.2587998     0.46749277]
 [ -0.4880805      0.73004459    0.47834331]] 
'''

注意:函数 self_adjoint_eig() 在第一行输出特征值。数学中,这就是所谓的矩阵的特征值分解。

 

如何工作...

 

Tensorflow给我们提供了工具来开始数值计算并把这种计算添加到图中。这些符号标记对于简单的矩阵操作来说似乎有些复杂。要记住:我们把这些操作添加到图里再告诉Tensorflow哪些张量会进行这些操作。它们现在看起来有些繁琐,但对理解后面章节中的符号标记很有用处,尤其是当这种计算方式使得完成我们的目标更容易的时候。