基於滴滴雲虛擬機器的TensorFlow搭建與使用
前言
隨著AI演算法不斷髮展,對應的應用領域也越來越廣泛,比如自動駕駛、語音機器人等技術已經越來越貼近人們的生活。但是AI龐大的演算法體系讓工程師們望而卻步,不知道該如何使用這些演算法來解決工程中的實際問題,所以市面上誕生了很多優秀的開源框架,本文介紹的TensorFlow就是其中一款最廣為人知的工具集合,文章將從TensorFlow的安裝和其在神經網路中的簡單使用這兩個大方面展開。
TensorFlow的基本概念
TensorFlow是一個採用資料流圖(data flow graphs),用於數值計算的開源軟體庫。節點(Nodes)在圖中表示數學操作,圖中的線(edges)表示在節點間相互聯絡的多維資料陣列,即張量(tensor)。它靈活的架構使得可以在多種平臺上展開計算,例如臺式計算機中的一個或多個CPU(或GPU)、伺服器、移動裝置等。
TensorFlow 最初由Google大腦小組(隸屬於Google機器智慧研究機構)的研究員和工程師們開發出來,用於機器學習和深度神經網路方面的研究,但這個系統的通用性使其也可廣泛用於其他計算領域。
TensorFlow的安裝
1.作業系統的選擇與安裝
TensorFlow支援幾乎所有的主流作業系統,Ubuntu,CentOS,MacOS等是最常用的選擇,但Android和iOS也在其支援之列。本文將選擇最常用的Linux開發版——Ubuntu作為安裝環境。
首先,在滴滴雲上申請一個雲伺服器,作業系統選擇Ubuntu16.04,配置CPU 2核、記憶體 4G(可以按照自己的實際需求配置),也可以選擇GPU,因為TensorFlow本身支援各種架構的計算,可以在程式碼中動態選擇執行在CPU上還是在GPU上面。一旦選擇完配置,點選建立就會快速生成雲伺服器。
2.Python環境及TensorFlow的安裝
TensorFlow 目前已經支援使用多種介面進行呼叫,但是Python目前在人工智慧領域使用得越來越廣泛,不僅TensorFlow,很多機器學習的演算法首選使用Python進行描述,目前可以選擇Python2.x或者3.x,而本次使用的滴滴雲伺服器安裝的Ubuntu預設已經安裝了2.x的環境,可以用以下語句來檢測:
[email protected]:~$ python --version
Python 2.7.12
以上表明安裝了2.7.12的版本,是符合TensorFlow要求的一個版本。
但是隻安裝Python還不能達到最小環境需求,因為Python的許多功能是以庫的形式存在的,例如TensorFlow本身就是一個庫,另外還需要NumPy。如果一個個通過原始碼安裝比較麻煩,一般使用Python的庫管理器:pip來進行安裝和管理所有的Python庫。
滴滴雲的Ubuntu中已經預置了pip,所以無需安裝就直接可以使用。
[email protected]:~$ sudo pip install numpy
...
...
Installing collected packages: numpy
Successfully installed numpy
當出現上述Successfully installed時就表明numpy已經安裝成功,下面用同樣的方法可以安裝TensorFlow的Python庫:
[email protected]:~$ sudo pip install -i http://pypi.mirrors.ustc.edu.cn/simple/ --trusted-host pypi.mirrors.ustc.edu.cn tensorflow
...
...
Successfully installed absl-py-0.5.0 astor-0.7.1 backports.weakref-1.0.post1 enum34-1.1.6 funcsigs-1.0.2 futures-3.2.0 gast-0.2.0 grpcio-1.15.0 h5py-2.8.0 keras-applications-1.0.6 keras-preprocessing-1.0.5 markdown-3.0.1 mock-2.0.0 pbr-4.3.0 protobuf-3.6.1 tensorboard-1.11.0 tensorflow-1.11.0 termcolor-1.1.0 werkzeug-0.14.1
如果出現紅色的錯誤可以執行以下命令來解決:
[email protected]:~$ sudo pip install --upgrade pip
當出現上面的成功回顯時就表明TensorFlow的安裝包已經安裝完畢,可以使用了。
接下去輸入以下命令進入Python環境進行驗證:
[email protected]:~$ python
Python 2.7.12 (default, Dec 4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2018-10-29 18:51:46.520277: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled touse: AVX2 FMA
>>> print(sess.run(hello))
Hello, TensorFlow!
出現上面的程式碼執行結果就表明已經在滴滴雲伺服器上運行了TensorFlow版本的"hello,world"程式。
3. TensorFlow在神經網路中的簡單應用
神經網路作為機器學習的前延技術,這些年來廣泛地出現在各種機器學習的應用中,而TensorFlow中較好地封裝了一些最常用的演算法,所以使用TensorFlow可以高效地組織演算法,快速地訓練出想要的模型。
在使用神經網路解決實際的分類或者回歸問題時需要更好地設定引數取值。使用監督學習的方式設定神經網路引數需要有一個標註好的訓練資料集。以判斷零件是否合格為例,這個標註好的訓練資料集就是收集的一批合格零件和一批不合格零件。
監督學習最重要的思想就是,在已知答案的標註資料集上,模型給出的預測結果要儘量接近真實的答案。通過調整神經網路中的引數對訓練資料進行擬合,可以使得模型對未知的樣本提供預測的能力。
在神經網路優化演算法中, 最常用的方法是反向傳播演算法(backpropagation)。下圖展示了使用反向傳播演算法訓練神經網路的流程圖,本文將不過多講解反向傳播的數學公式,而是重點介紹如何通過TensorFlow 實現反向傳播的過程。
從上圖可以看出,通過反向傳播演算法優化神經網路是一個迭代的過程。在每次迭代的開始,首先需要選取一小部分訓練資料,這一小部分資料叫做一個batch。然後,這個batch 的樣例會通過前向傳播演算法得到神經網路模型的預測結果。因為訓練資料都是有正確答案標註的,所以可以計算出當前神經網路模型的預測答案與正確答案之間的差距。
最後,基於這預測值和真實值之間的差距,反向傳播演算法會相應更新神經網路引數的取值,使得在這個batch 上神經網路模型的預測結果和真實答案更加接近。通過TensorFlow 實現反向傳播演算法的第一步是使用TensorFlow 表達一個batch 的資料。在上面的樣例中使用了常量來表達過一個樣例:
x=tf.constant([[0.7, 0.9]])
但如果每輪迭代中選取的資料都要通過常量來表示,那麼TensorFlow的計算圖將會太大。因為每生成一個常量,TensorFlow 都會在計算圖增加一個節點。一般來說,一個神經網路的訓練過程會需要經過幾百萬輪甚至幾億輪的迭代,這樣計算圖就會非常大,而且利用率很低。為了避免這個問題,TensorFlow 提供了placeholder 機制用於提供輸入資料。placeholder 相當於定義了一個位置,這個位置中的資料在程式執行時再指定。
這樣,在程式中就不需要生成大量常量來提供輸入資料,而只需要將資料通過placeholder 傳入TensorFlow 計算圖。在placeholder 定義時,這個位置上的資料型別是需要指定的。和其他張量一樣,placeholder 的型別也是不可以改變的。
placeholder 中資料的維度資訊可以根據提供的資料推導得出,所以不一定要給出。下面給出了通過placeholder 實現前向傳播演算法的程式碼:
x = tf.placeholder(tf.float32, shape=(1, 2), name="input")
print(sess.run(y, feed_dict={x: [[0.7,0.9]]}))
在呼叫sess.run 時,需要使用feed_dict 來設定x 的取值。在得到一個batch 的前向傳播結果之後,需要定義一個損失函式來刻畫當前的預測值和真實答案之間的差距。然後通過反向傳播演算法來調整神經網路引數的取值使得差距可以被縮小。
損失函式將在後面的文章中更加詳細地介紹。以下程式碼定義了一個簡單的損失函式,並通過TensorFlow 定義了反向傳播的演算法:
#定義損失函式來刻畫預測值與真實值的差距
cross_entropy = -tf.reduce_mean(
y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
# 定義學習率。
learning_rate = 0.001
# 定義反向傳播演算法來優化神經網路中的引數。
train_step =
tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
在上面的程式碼中,cross_entropy 定義了真實值和預測值之間的交叉熵(cross entropy),這是分類問題中一個常用的損失函式。第二行train_step 定義了反向傳播的優化方法。
目前TensorFlow 支援10 種不同的優化器,讀者可以根據具體的應用選擇不同的優化演算法。比較常用的優化方法有三種:tf.train.GradientDescentOptimizer、class tf.train.AdamOptimizer和tf.train.MomentumOptimizer。
4.總結
人工智慧的飛速發展給科技界帶來了新的氣象,TensorFlow等機器學習框架給我們帶來了新的學習和應用AI的途徑,本文講述瞭如何在一個全新的滴滴雲伺服器上一步步搭建Python和TensorFlow,並使用TensorFlow實現了一個簡單的神經網路反向傳播演算法。