如何用一個(gè)Python示例入門TensorFlow?
本文附帶的代碼可以在這里下載:
https://github.com/NMZivkovic/IntrouductionToTensorFlow
最近,我向大家介紹了我的 side-project,是個(gè)用 C# 寫的簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)項(xiàng)目。正如我在那篇文章中提到的,給出的解決方案離***方案還差的太遠(yuǎn)。假如要達(dá)到專業(yè)化使用的程度,這個(gè)解決方案還需要使用更多的數(shù)學(xué)和矩陣乘法。幸運(yùn)的是,Google 里有些聰明人創(chuàng)造了一個(gè)做這件事情的庫——TensorFlow。這是一個(gè)廣受歡迎的開源庫,正如你目前所了解的那樣,它擅長(zhǎng)于數(shù)字計(jì)算,這對(duì)我們的神經(jīng)網(wǎng)絡(luò)計(jì)算至關(guān)重要。它為大多數(shù)主流程序語言進(jìn)行深度學(xué)習(xí)領(lǐng)域的開發(fā)提供了應(yīng)用程序接口。
TensorFlow 是如何運(yùn)作的呢? 它的整個(gè)解決方案是基于張量進(jìn)行的,張量是 TensorFlow 的原始單元。TensorFlow 使用一個(gè)張量數(shù)據(jù)結(jié)構(gòu)來表示所有數(shù)據(jù)。在數(shù)學(xué)中,張量是描述其他幾何對(duì)象之間的線性關(guān)系的幾何對(duì)象。在 TesnsorFlow 中,它們是多維數(shù)組或數(shù)據(jù),比如矩陣。其實(shí)它并不像這樣簡(jiǎn)單, 但這就是我現(xiàn)在想說的深入線性代數(shù)的整個(gè)張量的概念。無論如何,我們可以把張量看作是 n 維陣列,對(duì)它使用矩陣運(yùn)算是簡(jiǎn)單且有效的。例如,在下面的代碼中,我們定義了兩個(gè)常量張量,并將一個(gè)值添加到另一個(gè)上。
這就是整個(gè)張量概念在線性代數(shù)中,
我們都知道,常量的值是不變的。而 TensorFlow 擁有豐富的 API,它的文檔也很齊全,我們可以使用它定義其他類型的數(shù)據(jù),比如變量。
除了張量之外,TensorFlow 還使用數(shù)據(jù)流圖。圖中的節(jié)點(diǎn)表示數(shù)學(xué)運(yùn)算,邊表示在它們之間通信的張量。
安裝和設(shè)置
TensorFlow 為各種程序語言提供了 API,比如 Python、C++、Java、Go、Haskell 和 R(以第三方庫的形式)。此外,它支持不同類型的操作系統(tǒng)。在本文中,我們將在 Windows 10 上使用 Python,因此會(huì)提及這個(gè)平臺(tái)上的安裝過程。TensorFlow 只支持 Python 3.5 和 3.6,所以請(qǐng)確保你的系統(tǒng)中安裝了其中的一個(gè)版本。對(duì)于其他的操作系統(tǒng)和語言,你可以查看官方的安裝指南。我們需要了解的另一件事是系統(tǒng)的硬件配置。安裝 TensorFlow 可以有兩種選擇:
- 只支持 CPU 的 TensorFlow 版本。
- 支持 GPU 的 TensorFlow 版本。
如果你的系統(tǒng)有一個(gè) NVIDIA GPU,那么你可以安裝支持 GPU 的 TensorFlow 版本。當(dāng)然,GPU 版本更快,但是 CPU 版更容易安裝和配置。
如果你使用 Anaconda 安裝 TensorFlow,可以按照以下步驟完成:
通過運(yùn)行命令來創(chuàng)建一個(gè) conda 環(huán)境“tensorflow”。
- conda create -n tensorflow pip python=3.5
通過命令激活創(chuàng)建的環(huán)境:
- activate tensorflow
調(diào)用該命令來在你的環(huán)境中安裝 TensorFlow。對(duì)于 CPU 版本運(yùn)行這個(gè)命令:
- pip install --ignore-installed --upgrade tensorflow
對(duì)于 GPU 版本運(yùn)行命令:
- pip install --ignore-installed --upgrade tensorflow-gpu
當(dāng)然,你也可以使用“native pip”命令來安裝 TensorFlow。對(duì)于 CPU 版本運(yùn)行:
- pip3 install --upgrade tensorflow
對(duì)于 GPU TensorFlow 版本運(yùn)行命令:
- pip3 install --upgrade tensorflow-gpu
現(xiàn)在我們已經(jīng)安裝了 TensorFlow。接下來開始解決我們要解決的問題。
Iris 數(shù)據(jù)集分類問題
Iris 數(shù)據(jù)集,以及 MNIST 數(shù)據(jù)集,可能是模式識(shí)別文獻(xiàn)中***的數(shù)據(jù)集之一。這是機(jī)器學(xué)習(xí)分類問題的“Hello World”示例。它最早是在 1936 年由 Ronald Fisher 推出的。他是英國(guó)的統(tǒng)計(jì)學(xué)家和植物學(xué)家,他在論文《使用多重測(cè)量解決生物分類問題》中使用了這個(gè)例子,直到今天這篇論文也經(jīng)常被引用。該數(shù)據(jù)集包含 3 個(gè)類別,每個(gè)類別有 50 個(gè)實(shí)例。每個(gè)類別都是一種類型的 Iris 植物:Iris setosa、Iris virginica 和 Iris versicolor。***類是線性可分的,但后兩種不是線性可分的。每個(gè)記錄都有五個(gè)屬性:
- cm 表示的 Sepal 長(zhǎng)度
- cm 表示的 Sepal 寬度
- cm 表示的 Petal 長(zhǎng)度
- cm 表示的 Petal 寬度
類別 Class(Iris setosa, Iris virginica, Iris versicolor)
我們要?jiǎng)?chuàng)建神經(jīng)網(wǎng)絡(luò)的目標(biāo)是根據(jù)其他屬性來預(yù)測(cè) Iris 的種類。這意味著它需要?jiǎng)?chuàng)建一個(gè)模型,描述屬性值和類別之間的關(guān)系。
TensorFlow 工作流
大部分的 TensorFlow 代碼遵循這個(gè)工作流程:
- 導(dǎo)入數(shù)據(jù)集
- 使用附加列擴(kuò)展數(shù)據(jù)集,用以描述數(shù)據(jù)
- 選擇模型的類型
- 開始訓(xùn)練
- 評(píng)估模型的準(zhǔn)確性
- 使用模型預(yù)測(cè)結(jié)果
如果你關(guān)注我之前的博客文章,你可能會(huì)注意到開發(fā)任何人工神經(jīng)網(wǎng)絡(luò)都離不開訓(xùn)練和評(píng)估過程。這些過程通常是在兩個(gè)數(shù)據(jù)集上完成的,一個(gè)用于訓(xùn)練,另一個(gè)用于測(cè)試訓(xùn)練網(wǎng)絡(luò)的準(zhǔn)確性。通常,我們得到一組數(shù)據(jù),我們需要將它們分成兩個(gè)獨(dú)立的數(shù)據(jù)集,并使用其中一個(gè)進(jìn)行培訓(xùn),另一個(gè)用于測(cè)試。這一比率通常為 80% 到 20%。這次這些都已經(jīng)為我們做好了。你可以從這里下載訓(xùn)練數(shù)據(jù)集,從這里下載測(cè)試數(shù)據(jù)集?;蛘吣憧梢詮倪@里下載完整的代碼和數(shù)據(jù)。
編碼
在繼續(xù)之前,我得首先說明一下,我使用 Spyder IDE 進(jìn)行開發(fā),因此我將使用這個(gè)環(huán)境來解釋整個(gè)過程。
我們需要做的***件事是導(dǎo)入數(shù)據(jù)集并解析它。為此,我們需要使用另一個(gè) Python 庫 -Pandas。這是另一個(gè)開源庫,為 Python 提供了易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具。
正如你所看到的,首先我們使用 readcsv 函數(shù)將數(shù)據(jù)集導(dǎo)入到本地變量中,然后我們將輸入 (train_x、test_x) 和預(yù)期輸出 (train_y、test_y) 分離開來,創(chuàng)建四個(gè)獨(dú)立的矩陣。以下是他們的樣子:
我們準(zhǔn)備好了用于訓(xùn)練和測(cè)試的數(shù)據(jù)。現(xiàn)在,我們需要定義特征列,這也是神經(jīng)網(wǎng)絡(luò)需要的。
我們現(xiàn)在需要選擇我們將要使用的模型。在我們的問題中,我們?cè)噲D根據(jù)屬性數(shù)據(jù)來預(yù)測(cè) Iris 的類型。所以我們要從 TensorFlow API 中選擇一個(gè)評(píng)估器。評(píng)估器類的一個(gè)對(duì)象封裝了構(gòu)建 TensorFlow 圖形并運(yùn)行 TensorFlow 會(huì)話的邏輯。為此,我們將使用 DNN 分類器。我們將添加兩個(gè)隱藏的層,每個(gè)層有十個(gè)神經(jīng)元。
在那之后,我們將用我們從訓(xùn)練數(shù)據(jù)集中選取的數(shù)據(jù)來訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)。首先,我們將定義訓(xùn)練功能。該函數(shù)需要通過擴(kuò)展和創(chuàng)建多個(gè)批次來提供來自訓(xùn)練集的數(shù)據(jù)。如果訓(xùn)練樣本是隨機(jī)的訓(xùn)練效果也會(huì)更好。這就是為什么調(diào)用 shuffle 函數(shù)的原因。總之, train_function 使用經(jīng)過訓(xùn)練的數(shù)據(jù)集,隨機(jī)地從數(shù)據(jù)中選取數(shù)據(jù),并將數(shù)據(jù)反饋給 DNN 分類器的訓(xùn)練方法,從而創(chuàng)建大量的數(shù)據(jù)。
***,我們調(diào)用評(píng)估函數(shù)來評(píng)估我們的神經(jīng)網(wǎng)絡(luò),并給出網(wǎng)絡(luò)的回準(zhǔn)度。
當(dāng)我們運(yùn)行這段代碼后,將得到如下結(jié)果:
所以,我的神經(jīng)網(wǎng)絡(luò)的精度是 0.93,非常不錯(cuò)。在此之后,我們可以使用單個(gè)數(shù)據(jù)調(diào)用分類器,并對(duì)其進(jìn)行預(yù)測(cè)。
結(jié)論
神經(jīng)網(wǎng)絡(luò)已經(jīng)存在很長(zhǎng)時(shí)間了,現(xiàn)在的幾乎所有重要的概念都可以追溯到 70 年代或 80 年代。阻礙整個(gè)領(lǐng)域發(fā)展的問題是那時(shí)我們沒有強(qiáng)大的計(jì)算機(jī)和 GPU 來運(yùn)行這些程序?,F(xiàn)在,我們不僅可以做到這一點(diǎn),而且 Google 通過創(chuàng)造這一偉大的工具使神經(jīng)網(wǎng)絡(luò)變的流行起來,那就是開源的 TensorFlow。如今,我們還有其他更高級(jí)的 API,可以進(jìn)一步簡(jiǎn)化神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)。其中一些比如 Keras 也是基于 TensorFlow 運(yùn)行的。在以后的文章中,我們將對(duì)這一問題進(jìn)一步探討。
英文原文鏈接:https://rubikscode.net/2018/02/05/introduction-to-tensorflow-with-python-example/