TensorFlow for Dummies學習筆記(一)

Introduction

About This Book

機器學習借鑑了多個數學分支,不幸的是真實的世界並不覺得有任務義務按數學行事。即使用了最好的數學模型,你仍然有可能以糟糕的結果告終。TensorFlow並非要給你分析一個系統的理想模型,而是幫你減少機器學習開發花費的時間和遇到的挫折。

Chapter 1: Introducing Machine Learning with TensorFlow

Understanding Machine Learning

機器學習通過發現大量數據中的模式,處理郵件分類、路線規劃、商品推薦等不確定事件。

The Development of Machine Learning

統計迴歸仍然在機器學習中扮演重要角色。最新的突破是在神經網絡獲得的。神經網絡是對大腦的逆向工程,曾經因爲計算能力和編程技術(缺乏框架,類庫)的限制,機器學習的理論相對成熟而應用較少。隨着大量數據的累積,計算能力和技術的進步,機器學習開始流行。

Machine Learning Frameworks

機器學習框架常起步於數值計算類庫或工具集,目前流行的有5個:

> TORCH 第一個機器學習框架,使用Lua作爲接口語言限制了其推廣;

> THEANO 因其高性能和支持自動微分,開發多用其作爲數值計算工具;

> CAFFE 用C++實現支持GPU加速,受學術和企業屆歡迎;

> KERAS 更強調開發的便利性,可作爲其它框架的接口;

> TENSORFLOW 兼具高性能和開發便利性。

Chapter 2: Getting Your Feet Wet

Exploring the TensorFlow Installation

安裝TensorFlow以後,常用的Python包有:

> tensorflow 框架的中心包,常引入爲tf

> tf.train 和訓練相關的優化器和其它類

> tf.nn 神經網絡類和相關的數學操作

> tf.layers 多層神經網絡相關的函數

Setting the Style

Google推薦的編碼規範:https://www.tensorflow.org/community/style_guide

Python官方的編碼規範:https://www.python.org/dev/peps/pep-0008/

Chapter 3: Creating Tensors and Operations

Tensor可以理解爲多維數組。

Creating Tensors

在TensorFlow中爲類Tensor的實例。Tensor可以包含數值(默認float32, int32等)、布爾或字符串類型元素,一個Tensor只能含有一種類型。不同於通常的類實例,Tensor需通過API創建,變換或者操作。

Creating Tensors with Known Values

常用tf.constant(array),還有tf.zeros, tf.ones, tf.fill, tf.linespace, tf.range等函數可用。

Creating Tensors with Random Values

使用tf.random_normal(shape)等。

Transforming Tensors

使用tf.reshape(tensor, shape),tf.reverse(tensor, axis)等。

tf.reverse(tf.constant([1, 2, 3], [4, 5, 6]]), [0])結果爲[[4, 5, 6], [1, 2, 3]]

Creating Operations

調用操作函數時並不馬上執行,而是加入到當前的圖中,待session執行圖時執行,因此稱作Creating Operations。

基本數學操作(shape相同,按元素操作):tf.add, tf.multiply等

取整,比較操作:tf.round, tf.maximum等

向量和矩陣操作:tf.tensordot, tf.matmul等

Chapter 4: Executing Graphs in Sessions

創建操作時加入圖而不馬上執行,原因是圖可導出到文件或者在遠程系統加載。

Forming Graphs

用tf.get_default_graph()獲得當前的圖。

用 with tf.Graph().as_default(): 創建並切換到新的圖。

用tf.train.write_graph將圖寫入文件。

Creating and Running Sessions

常用 with tf.Session() as sess: 創建一個新Session。

用sess.run(fetches, feed_dict=None, options=None, run_metadata=None)執行Session,通常返回和fetches形狀相同的narray。也可使用res1, res2 = sess.run([t1, t2])同時執行兩個Tensor並返回。

Writing Messages to the Log

可使用tf.logging.info()等函數輸出分級別的日誌。

Visualizing Data with TensorBoard

使用tf.summary包中的函數創建並輸出sacalar, histogram等圖形,可在TensorBoard中顯示圖形。執行tensorboard --logdir=outpu啓動。

Chapter 5: Training

Training in TensorFlow

訓練流程包括4步:

1. 構建一個模型的數學表達式,包括輸入輸出和訓練中被更新的變量;

2. 定義一個測量模型輸出和實際值之間差異的誤差表達式,使用誤差表達式創建一個Optimizer,並調用其minimize方法;

3. 配置提供訓練數據的feed_dict;

4. 調用session的run方法,執行訓練。

Formulating the Model

本書中一類是迴歸模型,一類是神經網絡模型。

Tensorflow中,可訓練的參數是Variable類的實例。

Looking at Variables

Variable與Tensor相似,都可以表示爲多維數組,但Variable僅用於存儲訓練中被更新的數據。需用不同的API創建。使用tf.Variable(_aTensor)創建Variable。需創建一個初始化操作,並在session中執行。常用tf.global_variables_initializer()。

Determining Loss

TensorFlow中文檔中loss是機器學習文獻中常出現的cost。Mean squired error是一種計算表達式模型loss的常用方法:sum((yo-y)^2)/N。神經網絡模型不能以簡單的等式計算loss。

Minimizing Loss with Optimization

優化器(Optimizer)的minimize(loss)方法,返回一個可以被sess.run()執行的operation。訓練的過程即多輪執行優化器的最小化操作。

梯度下降法(GradientDescentOptimizer):函數的梯度是一個vector,元素爲函數在各維度上的偏微分。梯度的方向可以理解爲向高點最陡峭的方向,而梯度的反方向爲向低點最陡峭的方向。梯度下降法沿着梯度的反方向移動,以求解最小值。優點是一個古老,簡單,易於理解的算法。缺點爲,可能找到了局部最小值;通常緩慢收斂到最小值;僅可用於可微分的函數;可能因learning rate選擇不當而振盪無法到達最小值。

除了梯度下降法,還有MomentumOptimizer, AdagradOptimizer, AdamOptimizer等優化器。

Feeding Data into a Session

使用tf.placeholder(dtype, shape=None, name=None)創建一個佔位符;在模型和損失函數中使用佔位符;在sess.run中使用feed_dict向佔位符喂數。

Saving and Restoring Variables

使用tf.train.Saver保存參數。取回參數分爲兩步:使用1) saver = tf.train.import_meta_graph加載到當前graph,使用restore訪問變量。

Working with SavedModels

作爲Saver的替代,可以創建一個SavedModel存儲應用的整個模型。

Session Hooks

可以實現一些回調函數,當某一事件發生時執行,如after_create_session, before_run, after_run等。

詞彙表

Tensor 張量。tensor可以理解爲多維數組,0維張量爲scalar 標量,1維張量爲vector 矢量,2維張量爲matrix 矩陣。在TensorFlow中:

> tensor是Tensor類的實例

> tensor的元素可以爲數值、字符串或布爾值,但一個tensor內的所有元素需類型一致

> tensor的創建、轉換和操作需使用tensorflow中的函數來執行

TensorFlow Google提供的用於開發機器學習應用的框架
Transforming tensorflow包中提供的一類函數,用於在tensor創建後,更新tensor的形狀,如reshape
Operation 可理解爲tensorflow包中提供的對tensor做操作的函數,如初始化、數學運算。操作本身只定義執行,要執行操作,需放在sess.run()的fetches參數中
Graph tensorflow的函數(creates, transforms, processes),並不執行操作,而是將操作增加到一個數據結構,即圖中。當session執行圖時,操作才真正被執行。圖的優點在於可以導出爲文件,或者加載到遠程系統。graph無需顯式創建,可通過tf.get_default_graph()獲取到默認
TensorBoard 在網頁中圖形化顯示tensorflow應用數據的實用程序。
summary data

TensorBoard所需的特殊結構的數據。

summary operation tf.summary中的一類Operation,用於給TensorBorard供summary data,執行時將相關數據寫入緩衝區。例如scalar, histogram。
Variable 與tensor類似,以多維數組存儲數據,可被Operations操作。用於存儲訓練中被更新的數據(變量)。變量是Variable類的實例,需在session執行前初始化。
Loss 機器學習文獻中常稱爲cost function, 可理解爲模型輸出和實測值(observed value)間的差。
Optimization 更新模型中的變量,以最小化loss的過程。tf.train中提供了多種優化算法,選擇適當的算法可以優化應用的性能。
Gradient Descent Optimizer 函數的梯度是一個vector,元素爲函數在各維度上的偏微分。梯度的方向可以理解爲向高點最陡峭的方向,而梯度的反方向爲向低點最陡峭的方向。梯度下降法沿着梯度的反方向移動,以求解最低點(最小值)

Momentum Optimizer

動量優化是在梯度下降基礎之上的改進,之前的優化結果影響未來的優化,以更快的趨近極小值。這種影響通常是“衰減”的,使用因子0.9。
Adagrad Optimizer Gradient descent和momentum算法都有一個缺點:在每個被訓練變量上使用了相同的learning rate,但不同的變量可能以不同的速率收斂。Adagrad = Adaptive Subgradient, 此法通過自適應梯度優化改進了這點。
Adam Optimizer Adam = Adaptive Moment Estimation,與Adagrad和Momentum算法都相似的算法。
Placeholder 佔位符。一個placeholder是一個常量tensor,持有session中用於喂數的一批數據。使用tf.placeholder創建placeholder時需指定類型,可指定形狀。
stochasticity 隨機性。爲了能找到全局最小值,隨機性算法將數據分爲若干個小batch,將其隨機餵給sess。
SGD =Stochastic gradient descent,隨機梯度下降算法

 

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