学习TensorFlow中矩阵的操作对于理解计算图中数据的流动来说非常重要。
1、创建矩阵
可以使用numpy数组(或者嵌套列表来创建二维矩阵);也可以使用创建张量的函数(比如,zeros(),ones(),truncated_normal()等)来指定一个二维形状的矩阵;也可以使用diag()函数从一个一维数组(或者列表)来创建一个对角矩阵。
import tensorflow as tf
import numpy as np
sess = tf.Session()
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.0, 2.0, 3.0], [-3.0, -7.0, -1.0], [0.0, 5.0, -2.0]]))
print(sess.run(identity_matrix))
#[[1.0, 0.0, 0.0]
# [0.0, 1.0, 0.0]
# [0.0, 0.0, 1.0]]
print(sess.run(A))
#[[0.96751703, 0.11397751, -0.3438891]
# [-0.10132604, -0.8432678, 0.29810956]]
print(sess.run(B))
#[[5.0, 5.0, 5.0]
# [5.0, 5.0, 5.0]]
print(sess.run(C))
#[[0.33184357, 0.08907614]
# [0.53189191, 0.067605299]
# [0.99889051, 0.67061249]]
print(sess.run(D))
#[[1.0, 2.0, 3.0]
# [-3.0, -7.0, -1.0]
# [0.0, 5.0, -2.0]]
2、矩阵的加法和减法
print(sess.run(A+B))
#[[4.61596632, 5.39171136, 4.4325695]
# [3.260702736, 5.14477345, 4.98265553]]
print(sess.run(B-B))
#[[0.0, 0.0, 0.0]
# [0.0, 0.0, 0.0]]
3、矩阵的乘法
print(sess.run(tf.matmul(B, identity_matrix)))
#[[5.0, 5.0, 5.0]
# [5.0, 5.0, 5.0]]
4、矩阵的转置
print(sess.run(tf.transpose(C)))
#[[0.67124544, 0.26766731, 0.99068872]
# [0.25006028, 0.86560275, 0.58411312]]
5、矩阵的初始化
A和C每次运行都会初始化为不同的值。
6、矩阵的行列式
print(sess.run(tf.matrix_determinant(D)))
#-38.0
7、矩阵的逆矩阵
print(sess.run(tf.matrix_inverse(D)))
#[[-0.5, -0.5, -0.5]
#[0.15789474, 0.05263158, 0.21052632]
#[39473684, 0.13157895, 0.02631579]]
8、矩阵的分解
print(sess.run(tf.cholesky(identity_matrix)))
#[[1.0, 0.0, 1.0]
#[0.0, 1.0, 0.0]
#[0.0, 0.0, 1.0]]
9、矩阵的特征值和特征向量
print(sess.run(tf.self_adjoint_eig(D)))
#[[-10.65907521, -0.22750691, 2.88658212]
#[0.21749542, 0.63250104, -0.74339638]
#[0.84526515, 0.2587998, 46749277]
#[-0.4880805, 0.73004459, 0.47834331]]
注意:
1、TensorFlow中矩阵的求逆方法是Cholesky矩阵分解方法(又称为平方根法),矩阵需要为对称正定矩阵或者可进行LU分解。
2、self_adjoint_eig()函数的输出结果中,第一行为特征值,剩下的向量是对应的向量。在数学中,这个方法也叫做矩阵的特征分解。