1.1 TensorFlow最基礎的了解

這部分主要是為實踐的部分打個基礎,能簡單的理解TensorFlow的運行過程。所以大致上了解就可以了。

首先我們看一個矩陣相乘的例子:

oldsymbol{C}_{m}=oldsymbol{A}_{mn} cdot oldsymbol{X}_{n} (式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 | 机器学习 |