人工智慧入門:tensorflow 基本概念
機器學習和深度學習基礎
機器學習是一種人工智慧,具體來說是一門計算機科學。它的研究對象是從數據中學習到的系統和演算法,並從中歸納出新的知識。
一段程序或者一個系統需要通過機器學習來提高他在某個特定任務上的性能,學習的是過往的經驗。這種學習能力主要在於通過數據進行模式識別。
訓練一個機器學習系統,有兩種方式:監督學習和無監督學習。
監督學習是最常見的機器學習形式。在訓練階段把已知的數據,又稱訓練集,輸入到機器學習系統,訓練集應該包括原系統的輸入和期望輸出;很多監督學習演算法都有一個共性:通過最小化一個代價函數進行訓練。代價函數計算期望輸出和機器學習系統的輸出之間的標準偏差。完成訓練后,模型的精確性是通過測量另一組訓練集的期望輸出與機器學習系統輸出之間的偏差來測定。這組訓練集又稱為驗證集,它必須與訓練集完全獨立。
Advertisements
無監督學習經常用於聚類問題,這類問題只提供大量樣例,你不知道分類的依據,也不知道應該分成多少個類。這種問題是監督學習無法解決的,因為你無法給出期望輸出。
深度學習代表了機器學習領域的重大進步,在很多應用領域獲得了前所未見的成功,例如圖像識別,語音識別和自然語言處理(NLP).深度學習獲得如此大的成功,主要有以下幾個原因:
硬體性能的提升使得海量數據訓練成為可能
大數據時代來臨,海量數據的處理需求急迫
深度學習是基於人腦處理信息和學習的方式,並對外部刺激的響應。深度學習通過多層機器學習模型組成,前一層的輸出用作下一層的輸入。多層次的生物學意義在於,當大腦接收到圖像信息時,大腦要分成多個階段來處理,例如邊界檢測和形式感覺。
Advertisements
python基礎
>>> class Myclass: #定義一個類,只有類變數common
... common=10
...
>>> ins1=Myclass()
>>> ins2=Myclass() #創建類的兩個實例
>>> ins1.common
10
>>> ins2.common #兩個實例的common都被預設賦值為10
10
>>> Myclass.common=30 #使用類名賦值,所有實例都會更新common的值,因為他們指向同一個對象Myclass.common
>>> ins1.common
30
>>> ins2.common
30
>>> ins1.common=10 #給ins1.common分配一個新的對象,從此兩個實例不再同步。
>>> ins1.common
10
>>> ins2.common
30
>>> Myclass.common=50 #即使重新給類變數賦值,兩個實例不再同步。
>>> ins1.common
10
>>> ins2.common
50
>>> ins3=Myclass() #此後新建的實例,common都等於50,除非Myclass.common重新賦值
>>> ins3.common
50
tensorflow基礎
準備知識就這些了,下面開始動手學習tensorflow了。
我們來看這段代碼
>>> x=1
>>> y=x+9
>>> print(y) #這三句很好理解,就是計算了y=1+x=1+9=10
10
>>> import tensorflow as tf
>>> x=tf.constant(1,name='x') #創建常量x,且值為1
>>> y=tf.Variable(x+9,name='y') #創建變數y,定義y=x+9
>>> print(y) #輸出y
<tf.Variable 'y:0' shape=() dtype=int32_ref> #print的結果
最終輸出的不是10,卻是y的數據類型。這是因為variable y並不表示當前的值,它的本意是:當計算variable y時,用x+9賦值。也就是說這只是定義了x到y的一個函數。
要想完成這個函數運算,需要以下幾條語句
>>>model= tf.global_variables_initializer() #初始化模型變數
<tf.Operation 'init_1' type=NoOp>
>>> with tf.Session() as session: #創建一個session來計算y
... session.run(model) #運行模型
... print(session.run(y)) #輸出模型運行結果
10
這個步驟中,運行圖又叫做數據流圖,是在session中創建的。y=x+9直到session執行時才完成計算。
數據流圖(data flow Graphs)
機器學習是重複計算複雜數學表達式的結果,在tensorflow中,計算過程用數據流圖描述,圖中每個node表示一個數學運算的實例(加,減,乘,除等),沒條邊是一個多維數據集(tensor),運算就在邊上執行。
node(節點),每個節點表示一個運算實例,每個節點必須至少有一個輸入,可以沒有輸出。
Edges(邊),tensorflow中有兩種邊,普通的邊和特殊的邊
普通的邊是數據結構(tensors)的載體,一個節點的輸出變成另一個節點的輸入。
特殊的邊不做節點之間的連接工具,他表明兩個節點之間的控制關係。例如一條從A節點到B節點的特殊邊表明B只有在A完成之後才能執行。
operation(運算):它表示一個抽象的計算,例如矩陣加或者乘。相同的運算能操作不同的tensor元素類型,例如加法可以用於整數加法,也能用於浮點數加法。
kernel(內核):它表示運算的具體執行。一個kernel定義了在特定硬體資源上運算的執行方式。例如一個加法可以在cpu上執行也可以在GPU上執行。
session(會話):當用戶程序要在tensorflow運行系統上建立通信時,就必須創建session。一旦session創建好了,一個初始的空的數據流圖就創建好了。
session.extend() 函數可以用來擴展運行圖,即請求增加節點或者邊。
session.run():每調用一次完成一次運行圖的全部計算流程。
如何使用tensorboard?
tensorboard是可視化工具,用來分析數據流圖,也用於更好理解機器學習模型。它能看圖像化顯示各種關於參數和運算細節的統計。有時一個神經網路有36000個節點,為此,tensorboard可以把多個節點顯示成一個模塊。另外可視化過程是互動式的,用戶可以放大,擴展結點來觀察細節。
tensorboard在開發中也很有用,可以用來調整機器學習模型。我們用一個簡單例子來理解tensorboard的使用。
import tensorflow as tf
a=tf.constant(10,name="a")
b=tf.constant(90,name="b")
y=tf.Variable(a+b*2,name="y")
model=tf.global_variables_initializer()
with tf.Session() as se:
merged = tf.summary.merge_all() #該指令會合併運行圖中所有的summary
writer = tf.summary.FileWriter("/tmp/tensorflowlogs",se.graph) #該指令把所有的summary寫入文件
se.run(model)
print(se.run(y))
以上代碼可以輸出結果190.
然後運行sudo tensorboard --logdir=/tmp/tensorflowlogs 會顯示一條類似這樣的消息
TensorBoard 0.4.0rc3 at http://VM-149-75-ubuntu:6006
那麼你可以通過http://127.0.0.1:6006來訪問tensorboard。我這邊的顯示結果如下:
tensorboard使用特殊的圖標來區分常量和summary節點。每個節點每條線是什麼含義,可以參考左下角的圖例。