Tensorflow入門基本概念

Tensorflow中最基本的幾個概念:計算圖(tf.Graph)、張量(tf.Tensor)、會話(tf.Session)和優化方法(Optimizer)。我將從這幾個方面簡單說一下我的理解,對於文中出現的任何錯誤或者不準確的地方,歡迎大家批評指正!

TensorFlow程序一般可分爲兩個階段。第一階段需要定義計算圖中所有的計算,第二階段爲執行計算(會話部分)。

計算圖:

計算圖是TensorFlow的計算模型,所有TensorFlow的程序都會使用計算圖的形式來進行表示。計算圖上的每一個節點都是一個運算,而計算圖上的邊則表示了運算之間的數據傳遞關係。計算圖上還保存了每個運算的設備信息(如是通過GPU上還是CPU上運行的)以及運算之間的依賴關係。計算圖提供了管理不同集合的功能,並且TensorFlow會自動維護5個不同的默認集合。

張量:

張量是TensorFlow的數據模型,TensorFlow中所有運算的輸入、輸出都是張量。張量本身並不存儲任何數據,它只是對運算結果的引用。通過張量,可以更好的組織TensorFlow程序。從功能的角度看,張量可以被簡單理解爲多維數組。其中零階張量表示標量(scalar),也就是一個數;第一階張量爲向量(vector),也就是一維數組;第n階張量可以理解爲一個n維數組。但張量在TensorFlow中的實現並不是直接採用數組的形式,它只是對TensorFlow中運算結果的引用。張量中並沒有保存實際數字,它保存的是如何得到這些數字的計算過程。

張量的使用可以分爲兩類:

  • 第一類用途是對中間計算結果的引用。當一個計算包含很多中間結果時,使用張量可以大大提高代碼的可讀性。以下爲使用張量和不使用張量記錄中間結果來完成向量相加的功能的代碼對比。
#使用張量記錄中間結果
a = tf.constant([1.0,2.0],name="a")
b = tf.constant([2.0,3.0],name="b")
result = tf.add(a,b,name="add")

#不適用張量記錄中間結果
result = tf.constant([1.0,2.0],name="a") + tf.constant([2.0,3.0],name="b")

從上邊的代碼中可以看到,使用張量可以提高代碼的可讀性,a,b就是對常量生成這個計算結果的引用,這樣在做加法是就可以直接使用這兩個變量,而不需要再去生成這些常量。當計算複雜度增加時(比如構建深層神經網絡),通過張量來引用計算的中間結果可以使代碼的可閱讀性大大提升。通過張量來存儲中間結果可以方便獲取中間結果。比如在卷積神經網絡中,卷積層和池化層有可能改變張量的維度,通過result.get_shape函數來獲取張量的維度信息,可以避免人工計算的麻煩。

  • 第二類情況使計算圖構造完成後,張量可以用來獲得計算結果,也就是得到真實的數字。雖然張量本身沒有存儲具體的數字,但可以通過會話,就可以得到這些具體的數字。 

會話:

會話是TensorFlow的運算模型,它管理了一個TensorFlow程序擁有的系統資源,所有的運算都是要通過會話執行的。所有計算完成後需要關閉會話來幫助系統回收資源,否則可能出現資源泄露的問題。會話模式一般有兩種,如下所示:

#模式1
sess = tf.Session()
sess.run(...)
sess.close()

#模式2
with tf.Session() as sess:
    sess.run(...)

優化方法:

機器學習中訓練或優化參數是重要的一環,在TensorFlow中有一個tf.train模塊用來解決這個問題。我們常用的優化方法有:梯度下降(gradient descent)、Adam和Adagrad。下面介紹一些Optimizer實例類型:

Optimizer實例類型
實例類型 作用
tf.train.AdagradOptimizer 自適應梯度Optimizer,學習率隨時間銳減
tf.train.AdadeltaOptimizer 學習率不再絕對隨時間衰減
tf.train.MomentumOptimizer 實現Momentum優化算法
此外還有AdamOptimizer,FtrlOptimizer,RMSPropOptimizer

使用Optimizer類,總結爲以下步驟 :

  1. 爲需要優化的參數,創建一個Optimizer                                                                                                                                     opt = GradientDescentOptimizer(learning_rate= [learning rate])
  2. 創建一個操作,調用mimimize方法,最小化損失函數。                                                                                                            optimization_op = opt.minimize(cost,var_list=[variable list])                                                                                                      其中,minimize函數需要遵守以下的格式:
    tf.train.Optimizer.minimize(loss,global_step=None,var_list=None,gate_gradients=1,aggregation_method=None,colocate_gradients_with_ops = False,name=None)
    
    主要參數:
    loss:存放損失函數每輪迭代後的數值
    global_step:Optimizer執行一次迭代,加一
    var_list:需要優化的變量

     

 

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