深度學習:TensorFlow入門實戰

架構師Allen 發表於 2021-09-16
深度學習

推薦下我自己建的人工智慧Python學習群:[809160367],群裡都是學Python的,如果你想學或者正在學習Python ,歡迎你加入,大家都是軟體開發黨,不定期分享乾貨,還有免費直播課程領取。包括我自己整理的一份2021最新的Python進階資料和零基礎教學,歡迎進階中和對Python感興趣的小夥伴加入!還可以掃碼加VX領取資料哦! 

深度學習:TensorFlow入門實戰

 

 下面是正文

本章介紹一個現階段使用最廣泛的深層學習框架——TensorFlow。因為TensorFlow所擁有的社群支援度日益增長,所以使用它來構建複雜的深度學習應用程式是我們的不二選擇。從TensorFlow網站我們可以看到: 

TensorFlow是一個使用資料流圖進行數值計算的開源軟體庫。圖中的節點代表數學運算,而圖中的邊則代表在這些節點之間傳遞的多維陣列(張量)。藉助這種靈活的架構,你可以通過一個API將計算工作部署到桌上型電腦、伺服器或移動裝置中的一個或多個CPU或GPU上。TensorFlow 最初是由Google Brain團隊(隸屬於Google機器智慧研究部門)的研究人員和工程師開發的,旨在用於進行機器學習和深度神經網路研究。該系統具有很好的通用性,還可以應用於眾多其他領域。

4.1 安裝TensorFlow

TensorFlow有兩種版本可以安裝,分別是CPU版和GPU版。本書將使用GPU版。

4.1.1 在Ubuntu 16.04系統上安裝GPU版的TensorFlow

在安裝GPU版的TensorFlow之前,首先需要安裝最新版的NVIDIA驅動程式,因為現階段GPU版的TensorFlow只支援CUDA。接下來將會帶領讀者一步步地安裝NVIDIA驅動程式和CUDA8驅動程式。

1.安裝NVIDIA驅動程式和CUDA 8

首先需要安裝正確的NVIDIA驅動程式。這裡以GeForce GTX 960M GPU為例,因此會安裝nvidia-375(如果讀者使用的是其他版本,請通過NVIDIA官網來找到適合你的驅動程式)。如果你想確認你的GPU型號,可以在終端中使用如下命令。

lspci | grep –i nvidia

 你將會看到以下輸出。

深度學習:TensorFlow入門實戰

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update 
sudo apt-get install nvidia-375

在成功安裝NVIDIA驅動程式之後,重啟計算機,在終端輸入以下命令來確認是否成功安裝驅動程式。 

cat /proc/driver/nvidia/version

終端的輸出結果如下

深度學習:TensorFlow入門實戰

接下來,安裝CUDA 8。開啟NVIDIA官網的CUDA下載連結,根據圖4.1所示的螢幕截圖來選擇你的作業系統、體系結構、發行版、版本號以及安裝程式型別。

深度學習:TensorFlow入門實戰

安裝程式大約為2GB。需要使用如下安裝命令。

sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb 
sudo apt-get update 
sudo apt-get install cuda

接下來,需要通過以下命令將這些庫新增到.bashrc檔案中。

echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

 接下來,需要通過以下命令來驗證CUDA 8是否成功安裝。 

nvcc –V

如果安裝成功,將在終端中看到以下結果。

深度學習:TensorFlow入門實戰

最後,安裝cuDNN 6.0。NVIDIA CUDA深度神經網路庫(NVIDIA CUDA Deep Neural Network library,cuDNN)是一個支援GPU加速的深層神經網路庫。可以從NVIDIA官網下載它。使用以下命令來提取和安裝cuDNN。

cd ~/Downloads/
tar xvfcudnn*.tgz
cd cuda
sudo cp */*.h /usr/local/cuda/include/
sudo cp */libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/lib64/libcudnn*

為確保安裝成功,可以在終端中使用nvidia-smi工具來進行驗證。如果安裝成功,該工具將提供GPU的監控資訊,例如RAM和GPU的執行狀態。

2.安裝TensorFlow

在為TensorFlow準備好GPU環境之後,現在可以在GPU模式下安裝TensorFlow了。在安裝TensorFlow之前,可以先安裝一些有用的Python軟體包。這些包將在下一章中講解,它們可以使開發環境使用起來更加簡單。

通過以下命令開始安裝一些有關資料操作、分析和視覺化的庫。

sudo apt-get update && apt-get install -y python-numpy python-scipy python-nose python-h5py python-skimage 
python-matplotlib python-pandas python-sklearn python-sympy
sudo apt-get clean && sudo apt-get autoremove
sudo rm -rf /var/lib/apt/lists/*

也可以安裝更多有用的工具庫,比如虛擬環境(virtual environment)、Jupyter、Notebook等。

sudo apt-get update 
sudo apt-get install git python-dev python3-dev python-numpy python3-numpy build-essential python-pip python3-pip python-virtualenv swig python-wheel libcurl3-dev 
sudo apt-get install -y libfreetype6-dev libpng12-dev 
pip3 install -U matplotlibipython[all] jupyter pandas scikit-image

最後,通過使用以下命令安裝TensorFlow的GPU版。

pip3 install --upgrade tensorflow-gpu

接下來,使用Python來驗證TensorFlow是否安裝成功。

python3 
>>> import tensorflow as tf 
>>> a = tf.constant(5) 
>>> b = tf.constant(6) 
>>> sess = tf.Session() 
>>> sess.run(a+b) 
// this should print bunch of messages showing device status etc. // If everything goes well, you should see gpu listed in device 
>>> sess.close()

如果安裝成功將會在終端中看到以下內容。

深度學習:TensorFlow入門實戰

4.1.2 在Ubuntu 16.04系統上安裝CPU版的TensorFlow

在本節中,你將會安裝CPU版的TensorFlow,它的好處是在安裝之前不需要安裝額外的驅動程式。在安裝開始之前建議你先安裝一些有關資料操作和視覺化的軟體包。

sudo apt-get update && apt-get install -y python-numpy python-scipy python-nose python-h5py python-skimage 
python-matplotlib python-pandas python-sklearn python-sympy
sudo apt-get clean && sudo apt-get autoremove
sudo rm -rf /var/lib/apt/lists/*

也可以安裝更多有用的工具庫,比如虛擬環境(virtual environment)、Jupyter、Notebook等。

sudo apt-get update
sudo apt-get install git python-dev python3-dev python-numpy python3-numpy build-essential  python-pip python3-pip python-virtualenv swig python-wheel libcurl3-dev
sudo apt-get install -y libfreetype6-dev libpng12-dev
pip3 install -U matplotlibipython[all] jupyter pandas scikit-image

最後,安裝最新的CPU版的TensorFlow。 

pip3 install --upgrade tensorflow

接下來,為了驗證是否安裝成功,可以嘗試以下命令。 

python3 
>>> import tensorflow as tf 
>>> a = tf.constant(5) 
>>> b = tf.constant(6) 
>>> sess = tf.Session() 
>>> sess.run(a+b) 
>> sess.close()

 如果安裝成功,將會在終端中看到以下結果。

深度學習:TensorFlow入門實戰

 4.1.3 在Mac OS X上安裝CPU版的TensorFlow

本節將介紹使用virtualenv為Mac OS X安裝TensorFlow。首先,通過以下命令來安裝pip工具。

sudo easy_install pip

接下來,安裝虛擬環境庫。

sudo pip install --upgrade virtualenv

安裝完虛擬環境庫之後,我們需要建立一個容器或虛擬環境來承載安裝的TensorFlow,以及可能要安裝的任何軟體包,但不會影響底層主機系統。

virtualenv --system-site-packages targetDirectory # for Python 2.7
virtualenv --system-site-packages -p python3 targetDirectory # for Python 3.n

這裡所指的targetDirectory是~/tensorflow。

現在虛擬環境已經建立好了,使用以下命令訪問這個環境。

source ~/tensorflow/bin/activate

一旦你使用這個命令,就可以訪問剛剛建立的虛擬環境了,並且可以安裝任何只使用在這個環境中的軟體包,而不會對底層或主機系統產生影響。

要退出虛擬環境,可以使用以下命令。

Deactivate

要進入虛擬環境,可以使用以下命令。一旦使用完TensorFlow,就應該關閉它。

source bin/activate

為了安裝CPU版的TensorFlow,可以使用以下命令,該命令還將安裝TensorFlow所需的任何相關庫。 

(tensorflow)$ pip install --upgrade tensorflow      # for Python 2.7
(tensorflow)$ pip3 install --upgrade tensorflow     # for Python 3.n

4.1.4 在Windows系統上安裝CPU/GPU版的TensorFlow

假定你的系統上已經安裝了Python 3。要安裝TensorFlow,請按如下操作步驟以管理員身份啟動命令提示符。具體做法為:開啟“開始”選單,搜尋“cmd”,然後右擊它,並選擇“以管理員身份執行”,如圖4.2所示。

深度學習:TensorFlow入門實戰

 一旦開啟了一個命令視窗,即可以使用以下命令在GPU模式下安裝TensorFlow。

C:\> pip3 install --upgrade tensorflow-gpu

在使用下一個命令之前,讀者需要安裝pip或pip3(根據Python版本)。

或者使用以下命令安裝CPU版的TensorFlow。

C:\> pip3 install --upgrade tensorflow

4.2 TensorFlow執行環境

TensorFlow是谷歌的一個深度學習框架,顧名思義,它來源於神經網路在多維資料陣列或張量(Tensor)上執行的操作。TensorFlow實際上是張量流。

但首先我們要明確為什麼要在本書中使用深度學習框架。

  • 它簡化了機器學習程式碼。由於這些深度學習框架的存在,大部分深度學習和機器學習的研究都可以實現。它們允許資料科學家極其快速地迭代自己的深度學習專案,併為從業者提供了更多使用深度學習和其他機器學習演算法的機會。谷歌、Facebook等大公司正在使用這種深度學習框架來擴充套件更多的使用者。
  • 它可以計算梯度。深度學習框架也可以自動計算梯度。如果嘗試過逐步進行梯度計算,我們會發現梯度計算並不簡單,而且自己編寫出無Bug的程式可能會非常困難。
  • 它將機器學習應用程式標準化以進行共享。另外,可以在不同的深度學習框架中使用的預訓練模型可以線上獲得。這些預訓練模型可以幫助那些GPU資源有限的人,這樣他們就不必每次都從頭開始。我們可以站在巨人的肩膀上了解這些。
  • 不同的深度學習框架具有不同的優點。例如,範例、抽象層次、程式語言等。
  • 它會提供GPU並行處理的介面。使用GPU進行計算是一項非常吸引人的功能,因為由於龐大的核心數量和並行化,GPU加速程式碼的速度比CPU快得多。

這就是為什麼想在深度學習方面取得突破,TensorFlow是讀者的必然選擇,因為它可以為讀者的專案提供便利。

那麼,簡單地說,什麼是TensorFlow?

  • TensorFlow是來自谷歌的深度學習框架,它是使用資料流圖進行數值計算的開源軟體。
  • TensorFlow最初是由谷歌Brain Team開發的,目的是促進他們的機器學習研究。
  • TensorFlow可以理解為機器學習演算法的程式設計介面和執行這些演算法的實現工具。

那麼TensorFlow是怎麼工作的?它的規則是什麼?

4.3 計算圖

關於TensorFlow的所有重要創新中最著名的是:把所有數字計算都表示為計算圖,如圖4.3所示。任何TensorFlow程式都將變成一個計算圖,具體細節如下。

  • 圖中的節點是有關任意輸入和輸出的運算節點。
  • 圖中的節點之間的邊可以理解為在運算之間流動的張量。簡言之,在實踐中張量就是n維陣列。

使用圖4.3所示的計算圖作為深度學習框架的核心,其優勢在於它允許我們根據小而簡單的操作構建複雜的模型。另外,在後面的章節中會發現,這將使梯度計算變得非常簡單。

深度學習:TensorFlow入門實戰

理解TensorFlow計算圖概念的思路是,每個運算都是一個可以在圖節點上進行計算的函式。

4.4 TensorFlow中的資料型別、變數、佔位符

對計算圖的理解將幫助我們根據小的子圖和運算來思考複雜的模型。

看一個只有一個隱藏層的神經網路的例子,以及在TensorFlow中它的計算圖的形狀。

深度學習:TensorFlow入門實戰

在這裡求解經過ReLU啟用後的結果,首先某個引數矩陣W乘以某個輸入x再加上一個偏差項b,然後使用ReLU函式,取輸出和零中的最大值。

在圖4.3所示計算圖中,有變數b、矩陣W和一個叫作x的佔位符,圖中同時包含每個運算的節點。下面進一步講述這些節點型別。

4.4.1 變數

變數可以作為有狀態的節點從而輸出其當前值。在這個例子中,變數是b和W。變數是有狀態的含義是在多次執行之後,程式依然保留了它們的當前值,並且很容易將已儲存的值還原為變數,如圖4.4所示。

 

深度學習:TensorFlow入門實戰

 另外,變數還有其他有用的功能。例如,變數可以在訓練期間或者訓練後儲存到硬碟中,這有助於實現前面提到的功能:可以讓不同公司與團隊的人員儲存、儲存模型引數並將它們傳送給其他人。此外,變數可以調整變數以減少損失(loss),接下來我們將看到如何做到這一點。

注意,計算圖中的變數(如b和W)仍然表示運算,因為根據定義,圖中的所有節點都表示操作。因此,在執行過程中當求b和W的值時,我們將獲得這些變數的值。

可以使用TensorFlow的Variable()函式來定義一個變數並給它賦初始值。

var = tf.Variable(tf.random_normal((0,1)),name='random_values')

這行程式碼將定義一個1×1的變數並使用標準正態分佈初始化它[1],同時也可以給這個變數命名。

4.4.2 佔位符

下一個型別的節點是佔位符。佔位符是指其值在執行時傳入的節點,如圖4.5所示。

深度學習:TensorFlow入門實戰

如果計算圖中有依賴於某些外部資料的輸入,那麼可以使用佔位符在訓練期間新增值到計算圖中。所以,對於佔位符,我們不需要提供任何初始值,只需要給張量分配資料型別和形狀。這樣計算圖就知道要計算什麼,即使它尚未儲存任何值。

可以使用TensorFlow的placeholder()函式來建立佔位符。

ph_var1 = tf.placeholder(tf.float32,shape=(2,3))
ph_var2 = tf.placeholder(tf.float32,shape=(3,2))
result = tf.matmul(ph_var1,ph_var2)

這些程式碼行定義了兩個特定形狀的佔位符變數,然後定義了將這兩個值相乘的運算(具體介紹請參考4.4.3節)。

4.4.3 數學運算

第三類節點是數學運算,包括矩陣乘法(MatMul)、加法(Add)和ReLU,如圖4.6所示。所有這些運算都是TensorFlow圖中的節點,Tensorflow中的這些操作與NumPy操作非常相似。

深度學習:TensorFlow入門實戰

下面討論計算圖在程式碼中的形狀。

執行以下步驟來生成圖4.6。

1)建立並初始化權重W和b。初始化權重。矩陣W的方法是從均勻分佈W〜Uniform(−1,1)取樣並且初始化b為0

2)建立輸入佔位符x,輸入具有m * 784形狀的矩陣。

3)建立一個流程圖。

繼續並按照以下步驟來構建流程圖。

# import TensorFlow package 
import tensorflow as tf 
# build a TensorFlow variable b taking in initial zeros of size 100 
# ( a vector of 100 values) 
b  = tf.Variable(tf.zeros((100,)))
# TensorFlow variable uniformly distributed values between -1 and 1 
# of shape 784 by 100 
W = tf.Variable(tf.random_uniform((784, 100),-1,1))
# TensorFlow placeholder for our input data that doesn't take in 
# any initial values, it just takes a data type 32 bit floats as 
# well as its shape 
x = tf.placeholder(tf.float32, (100, 784))
# express h as TensorflowReLU of the TensorFlow matrix
#Multiplication of x and W and we add b 
h = tf.nn.relu(tf.matmul(x,W) + b )

從前面的程式碼可以看出,我們實際上並沒有用這段程式碼來操縱任何資料。我們只是在圖形內部構建符號,並且在執行此圖表之前,無法輸出h並檢視其值。所以,這段程式碼只用於構建模型的核心。如果你嘗試在前面的程式碼中輸出W或b的值,則應該在Python中執行以下操作。

深度學習:TensorFlow入門實戰

至此,我們已經定義了圖形,現在需要實際執行它。

4.5 獲取TensorFlow的輸出

在4.4節中,讀者知道了如何構建計算圖,現在介紹如何實際執行它並獲得它的輸出。

我們可以用會話(session)來部署/執行計算圖,會話可以將計算任務部署到一個特定的運算環境(如CPU或GPU)中。因此,可以使用會話將構建的計算圖部署到CPU或GPU中。

為了執行計算圖,需要定義一個名為sess的會話物件,並且呼叫帶有兩個引數的函式run。

sess.run(fetches, feeds)

其中,fetches指的是需要輸出的所有計算圖節點構成的列表,可以理解為我們希望計算的關鍵節點;feeds指的是從圖中的節點到讀者想要在模型中執行的實際值的字典對映,因此,feeds就是之前提到的要傳入數值到佔位符的地方。

詳細程式碼如下所示。

# importing the numpy package for generating random variables for 
# our placeholder x 
import numpy as np 
# build a TensorFlow session object which takes a default execution 
# environment which will be most likely a CPU 
sess = tf.Session() 
# calling the run function of the sess object to initialize all the 
# variables. 
sess.run(tf.global_variables_initializer())
# calling the run function on the node that we are interested in, 
# the h, and we feed in our second argument which is a dictionary 
# for our placeholder x with the values that we are interested in. 
sess.run(h, {x: np.random.random((100,784))})

在通過sess物件執行計算圖後,應該得到類似於以下的輸出。

深度學習:TensorFlow入門實戰

可以看到,在上面的程式碼片段的第9行[2]中,初始化變數,這是TensorFlow中的一個概念,它稱為延後計算(lazy evaluation)。這意味著計算圖只會在會話執行時計算。所以,呼叫函式
global_variables_initializer()實際上會初始化計算圖中所有的變數,比如之前例子中的W和b。 

 我們還可以在with程式碼塊中使用會話變數,以確保在執行完該計算圖後會話將關閉。

ph_var1 = tf.placeholder(tf.float32,shape=(2,3))
ph_var2 = tf.placeholder(tf.float32,shape=(3,2))
result = tf.matmul(ph_var1,ph_var2) 
with tf.Session() as sess: 
print(sess.run([result],feed_dict={ph_var1:[[1.,3.,4.],[1.,3.,4.]],ph_var2: [[1., 3.],[3.,1.],[.1,4.]]}))
Output: 
[array([[10.4, 22. ],       
       [10.4, 22. ]], dtype=float32)]

4.6 TensorBoard——視覺化學習過程

當我們使用TensorFlow訓練一個大規模的深度神經網路時,過程可能會很複雜且令人困惑,同時其相應的計算圖也會很複雜。為了更容易地理解訓練過程、除錯和優化TensorFlow程式,TensorFlow團隊開發了一套名為TensorBoard的視覺化工具,它是一套可以通過瀏覽器執行的Web應用程式。TensorBoard可用於視覺化TensorFlow計算圖,繪製有關計算圖執行結果的量化指標,並顯示其他資料(如通過它的影像)。配置好的TensorBoard介面如圖4.7所示。

深度學習:TensorFlow入門實戰

   深度學習:TensorFlow入門實戰