關於矩陣, 我們上一講中有講到, 也理清了它和張量之間的關係
這一講, 我們來講對矩陣的基本操作
import tensorflow as tf
如果你正在使用 Jupyter Notebook 或者 Python shell 進行編程,使用 tf.InteractiveSession 將比 tf.Session 更方便。InteractiveSession 使自己成爲默認會話,因此你可以使用 eval() 直接調用運行張量對象而不用顯式調用會話。
sess = tf.InteractiveSession()
I_matrix = tf.eye(5) #5*5 的單位矩陣
I_matrix.eval()
#輸出如下:
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]], dtype=float32)
x = tf.Variable(tf.eye(10))
#x.eval() 不行
x.initializer.run() #變量需要初始化操作對象來賦予實際意義 ; 或着 sess.run(x.initializer)但由於可以隱式調用會話,所以就不用這個
x.eval()
#輸出如下:
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)
A = tf.Variable(tf.random_normal([5,10])) #隨機矩陣
A.initializer.run()
A.eval()
#輸出如下:
array([[ 0.565306 , 1.6084712 , -0.5639168 , 1.0233473 , -0.7764772 ,
-0.31178263, 0.10248601, -2.6429496 , -0.7610655 , 0.4408502 ],
[ 0.9193569 , 0.18392901, 0.8217433 , 0.91792303, 1.1959397 ,
-0.19714825, -1.1799774 , 0.57328886, 1.1690964 , 0.6569883 ],
[-1.7664219 , -0.12248611, -0.9129961 , 0.07837848, 0.71676713,
-0.91333145, 0.4062142 , 1.2677864 , 0.6895964 , -0.3568808 ],
[-0.19590141, -0.45719898, 0.03834154, 2.934161 , 0.7811971 ,
-0.5815241 , 0.75360924, 0.6197759 , 0.38534704, 0.01617165],
[ 2.3681874 , -1.597189 , 0.1428296 , -1.4701174 , 2.470483 ,
1.6736263 , -0.3009129 , 0.02857626, -2.2169607 , 0.43409914]],
dtype=float32)
product = tf.matmul(A,x) #兩個矩陣相乘 , A爲5*10 x爲10*10, 可以進行相乘
product.eval()
#輸出如下
array([[ 0.565306 , 1.6084712 , -0.5639168 , 1.0233473 , -0.7764772 ,
-0.31178263, 0.10248601, -2.6429496 , -0.7610655 , 0.4408502 ],
[ 0.9193569 , 0.18392901, 0.8217433 , 0.91792303, 1.1959397 ,
-0.19714825, -1.1799774 , 0.57328886, 1.1690964 , 0.6569883 ],
[-1.7664219 , -0.12248611, -0.9129961 , 0.07837848, 0.71676713,
-0.91333145, 0.4062142 , 1.2677864 , 0.6895964 , -0.3568808 ],
[-0.19590141, -0.45719898, 0.03834154, 2.934161 , 0.7811971 ,
-0.5815241 , 0.75360924, 0.6197759 , 0.38534704, 0.01617165],
[ 2.3681874 , -1.597189 , 0.1428296 , -1.4701174 , 2.470483 ,
1.6736263 , -0.3009129 , 0.02857626, -2.2169607 , 0.43409914]],
dtype=float32)
b = tf.Variable(tf.random_uniform([5,10], 0, 2, dtype=tf.int32))# 含有0 和 1的矩陣
b.initializer.run()
b.eval()
#輸出如下:
array([[1, 1, 0, 0, 1, 0, 1, 0, 0, 0],
[1, 0, 0, 1, 0, 0, 0, 0, 1, 0],
[1, 1, 1, 0, 1, 0, 1, 0, 1, 0],
[1, 1, 0, 1, 1, 0, 0, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1]], dtype=int32)
b_new =tf.cast(b, dtype=tf.float32) #轉換數據類型
b_new.eval()
#輸出如下:
array([[1., 1., 0., 0., 1., 0., 1., 0., 0., 0.],
[1., 0., 0., 1., 0., 0., 0., 0., 1., 0.],
[1., 1., 1., 0., 1., 0., 1., 0., 1., 0.],
[1., 1., 0., 1., 1., 0., 0., 1., 1., 1.],
[0., 1., 1., 1., 1., 1., 1., 1., 1., 1.]], dtype=float32)
print(product.shape)
print(b_new.shape)
#輸出如下:
(5, 10)
(5, 10)
t_sum = tf.add(product, b_new) #矩陣的加減
t_sub = product - b_new
t_sum.eval()
#輸出如下:
array([[ 1.565306 , 2.6084712 , -0.5639168 , 1.0233473 , 0.22352278,
-0.31178263, 1.102486 , -2.6429496 , -0.7610655 , 0.4408502 ],
[ 1.9193568 , 0.18392901, 0.8217433 , 1.917923 , 1.1959397 ,
-0.19714825, -1.1799774 , 0.57328886, 2.1690965 , 0.6569883 ],
[-0.7664219 , 0.8775139 , 0.08700389, 0.07837848, 1.7167671 ,
-0.91333145, 1.4062142 , 1.2677864 , 1.6895964 , -0.3568808 ],
[ 0.8040986 , 0.542801 , 0.03834154, 3.934161 , 1.7811971 ,
-0.5815241 , 0.75360924, 1.6197759 , 1.385347 , 1.0161717 ],
[ 2.3681874 , -0.59718895, 1.1428297 , -0.47011745, 3.470483 ,
2.6736264 , 0.69908714, 1.0285763 , -1.2169607 , 1.4340992 ]],
dtype=float32)
t_sub.eval()
#輸出如下:
array([[-0.434694 , 0.60847116, -0.5639168 , 1.0233473 , -1.7764772 ,
-0.31178263, -0.897514 , -2.6429496 , -0.7610655 , 0.4408502 ],
[-0.08064312, 0.18392901, 0.8217433 , -0.08207697, 1.1959397 ,
-0.19714825, -1.1799774 , 0.57328886, 0.16909635, 0.6569883 ],
[-2.7664218 , -1.1224861 , -1.912996 , 0.07837848, -0.28323287,
-0.91333145, -0.59378576, 1.2677864 , -0.3104036 , -0.3568808 ],
[-1.1959014 , -1.457199 , 0.03834154, 1.934161 , -0.21880293,
-0.5815241 , 0.75360924, -0.3802241 , -0.614653 , -0.98382837],
[ 2.3681874 , -2.597189 , -0.8571704 , -2.4701176 , 1.4704831 ,
0.6736263 , -1.3009129 , -0.97142375, -3.2169607 , -0.56590086]],
dtype=float32)
a = tf.Variable(2*tf.ones([4,5]))
b = tf.Variable(tf.ones([4,5]))
a.initializer.run()
b.initializer.run()
A = a*b #矩陣與矩陣的各元素互乘
A.eval()
#輸出如下:
array([[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.]], dtype=float32)
B = tf.scalar_mul(2, A) #或者 B = 2*A
B.eval()
#輸出如下:
array([[4., 4., 4., 4., 4.],
[4., 4., 4., 4., 4.],
[4., 4., 4., 4., 4.],
[4., 4., 4., 4., 4.]], dtype=float32)
C = tf.div(a,b) #矩陣a的元素/ 矩陣b的元素
C.eval()
#輸出如下:
array([[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.],
[2., 2., 2., 2., 2.]], dtype=float32)
D = tf.mod(a,b) #矩陣a的元素對矩陣b的元素 進行求餘
D.eval()
#輸出如下:
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]], dtype=float32)
所有加法、減、除、乘(按元素相乘)、取餘等矩陣的算術運算都要求兩個張量矩陣是相同的數據類型,否則就會產生錯誤。可以使用 **tf.cast()**將張量從一種數據類型轉換爲另一種數據類型。
如果在整數張量之間進行除法,最好使用 tf.truediv(a,b),因爲它首先將整數張量轉換爲浮點類,然後再執行按位相除。