1.1 TensorFlow最基礎的了解
這部分主要是為實踐的部分打個基礎,能簡單的理解TensorFlow的運行過程。所以大致上了解就可以了。
首先我們看一個矩陣相乘的例子:
(式1.1.1)
(圖例這裡說下,大寫字母粗體代表矩陣,下標代表矩陣維度也就是後文中說的shape)
用TensorFlowflow實踐過程:
首先需要引入python庫,這是廢話:
import tensorflow as tf
TensorFlow中矩陣量的存在形式常用的三種,或者說相應的python類有三種:
tf.Variable()
tf.constant()tf.placeholder()
第一種Variable,是在神經網路可變化的量(可以通過trainable=False設置成不可變),運行中可賦值,可通過constant進行初始化,或其他方式初始化。
第二種是常量,可通過numpy中的array或者list,還有給定shape和數值進行賦值。
第三種placeholder相當於佔位符,也是有shape的量,因為訓練過程中需要不斷的賦值和替換值,而整體的計算結構是不變的,比如式1.1.1中X和C是不斷的替換的,而A是不變的,這時就需要用到placeholder。
如果式1.1.1矩陣A是一個4*4的方陣,且值全為1,接下來對變數A進行賦值
A=tf.Variable(tf.ones([4,4]))
這裡tf.ones(4,4)的意思是生成4*4全為1的方陣用於Variable的初始化
當然還可以前文說的用constant進行初始化
import numpy as npcst=tf.constant(np.ones([4,4]),dtype=tf.float32)#需要指定類型dtype=tf.float32,TensorFlow中不能隱式轉換浮點和整型#cst=tf.constant(1.0,shape=[4,4],dtype=tf.float32)也是可以,具體參考文檔A=tf.Variable(cst)
式1.1.1中X是一個4*1的向量,且值全為1,為了說明方便取用placeholder方法
X=tf.placeholder(dtype=tf.float32,shape=[4,1])
注意這裡並未對其賦值。之後有兩個矩陣就可以相乘了:
C=tf.matmul(A,X)
至此,整個計算過程已經用python描述的差不多了,但是實際上整個計算並未運行,我們只是對python程序描述了具體的矩陣相乘我們意圖是要如何計算,這裡TensorFlow中將其稱之為計算圖,具體的執行需要到c語言寫成的底層中。
python中需要產生一個也可以理解為上下文的東西去運行,描述的計算過程:
sess=tf.Session()
首先所有的Variable都要進行初始化,理解起來就是c語言層中malloc的過程。
init=tf.global_variables_initializer()
再次注意,所有變數在運行前都需要進行初始化!!
如上文所說所有的python寫成的代碼都沒有進行到底層中運行,需要進行:
sess.run(init)
至此才算初始化完畢。
接下來需要運行矩陣相乘的過程:
sess.run(C,feed_dict={X:[[1],[1],[1],[1]]})
feed的過程就是將X中的數據填入的過程,正如前文所說X是沒有值的,需要後續添加。
如何獲取變數的值呢?
A_val=A.value()Avalue=sess.run(A_val)#依然需要run一下
更進一步的現在出現了一個問題,如果式1.1.1中我們只知道C和X那麼問題就出現了,我們如何知道A中的數值呢?這是一個標準的反演問題,所謂反演簡單理解就是求解未知矩陣。此問題中我們需要求解的是A的矩陣
矩陣相乘過程的代碼如下:
import tensorflow as tfimport numpy as npX=tf.placeholder(dtype=tf.float32,shape=[4,1])A=tf.Variable(tf.zeros([4,4]))C=tf.matmul(A,X)sess=tf.Session()init=tf.global_variables_initializer()sess.run(init)print(sess.run(A))
現在A是未知的,那麼所得的C也是未知的,我們需要一個對比
比如sum(abs(Y-C))C是AX所得,而Y是期望所得,現在需要做的就是使得sum(abs(Y-C)),這裡需要用到最優化演算法,寫到程序里就是:
import tensorflow as tfimport numpy as npX=tf.placeholder(dtype=tf.float32,shape=[4,1])Y=tf.placeholder(dtype=tf.float32,shape=[4,1])A=tf.Variable(tf.zeros([4,4]))C=tf.matmul(A,X)sess=tf.Session()ce = tf.reduce_sum(tf.abs(Y-C))ts = tf.train.AdamOptimizer(1e-2).minimize(ce)init=tf.global_variables_initializer()#注意,此處變數初始化一定要在所有變數之後!sess.run(init)for itr in range(1000): inX=np.random.random([4,1]) simA=np.ones([4,4]) inY=np.matmul(simA,inX) #上部分用於生成數據 sess.run(ts,feed_dict={X:inX,Y:inY})CL=A.value()print(sess.run(CL))
tf.train.AdamOptimizer(1e-2).minimize(ce)這個過程就是使得tf.reduce_sum(tf.abs(Y-C))最小的過程,迭代好多次之後所得的結果如下:
很容易可以看到這是一個多解的問題,A的形式不只有一個。但是最終TensorFlow會給一個全局的最優解,理論上是這麼說,但看上面的例子自己理解一下吧。至此,TensorFlow的基礎已經說完。下面開始說明如何去理解神經網路。
推薦閱讀:
※域名關聯模型:讓惡意軟體自我暴露
※新手學機器學習一個月後,一些第一手乾貨分享
※李宏毅機器學習2016 第十五講 無監督學習 生成模型之 VAE
※從Nesterov的角度看:我們為什麼要研究凸優化?
※想學習「機器學習」,需要學習哪些先導課程?
TAG:神经网络 | TensorFlow | 机器学习 |