Tensorflow學習筆記day02 + 矩陣基本操作

關於矩陣, 我們上一講中有講到, 也理清了它和張量之間的關係

這一講, 我們來講對矩陣的基本操作

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),因爲它首先將整數張量轉換爲浮點類,然後再執行按位相除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章