天天看點

教你用TensorFlow實作神經網絡(附代碼)

如果你一直關注資料科學/機器學習,你就不能錯過深度學習和神經網絡的熱潮。網際網路公司正在尋找這方面的人,而且從競賽到開源項目,都有巨額獎金。 

如果你對深度學習所提供的前景感到興奮,但是還沒有開始,在這裡或許是你開始的第一步。 

在這篇文章中,我将介紹TensorFlow。閱讀本文後,你将能夠了解神經網絡的應用,并使用TensorFlow解決現實生活中的問題,本文中的代碼是用Python編寫的,Python最近的火爆也和深度學習有關。

何時使用神經網絡?

有關神經網絡和深度學習的更詳細的解釋, 請看這裡。其“更深”版本正在圖像識别,語音和自然語言處理等諸多領域取得巨大突破。

現在的主要問題是何時使用神經網絡?關于這點,你必須記住一些事情:

神經網絡需要大量的資訊資料來訓練

将神經網絡想象成一個孩子。它首先觀察父母如何走路。然後它才會獨立行走,并且每走一步,孩子都會學習如何執行特定的任務。如果你不讓它走,它可能永遠不會學習如何走路。你可以提供給孩子的“資料”越多,效果就越好。

當你有适當類型的神經網絡來解決問題時

每個問題都有自己的難點。資料決定了你解決問題的方式。例如,如果問題是序列生成,遞歸神經網絡更适合,而如果它是一個圖像相關的問題,你可能會采取卷積神經網絡。

硬體要求對于運作深度神經網絡模型是至關重要的

神經網絡很早以前就被“發現”了,但是近年來,神經網絡一直在發光,這是因為計算能力的強大。如果你想用這些網絡解決現實生活中的問題,準備購買一些高性能硬體吧!

如何解決神經網絡問題

神經網絡是一種特殊類型的機器學習(ML)算法。是以,與每個ML算法一樣,它遵循資料預處理,模型建構和模型評估等正常ML工作流程。我列出了一個如何處理神經網絡問題的待辦事項清單:

檢查神經網絡是否可以提升傳統算法。

做一個調查,哪個神經網絡架構最适合即将解決的問題。

通過你選擇的語言/庫來定義神經網絡架構。

将資料轉換為正确的格式,并将其分成批。

根據你的需要預處理資料。

增加資料以增加規模并制作更好的訓練模型。

将資料批次送入神經網絡。

訓練和監測訓練集和驗證資料集的變化。

測試你的模型,并儲存以備将來使用。

本文中,我将重點關注圖像資料。讓我們先了解一下,然後再研究TensorFlow。

圖像大多排列為3D陣列,尺寸指的是高度,寬度和顔色通道。例如,如果你現在截取了你的電腦的螢幕截圖,則會首先将其轉換為3D數組,然後将其壓縮為PNG或JPG檔案格式。

雖然這些圖像對于人來說是相當容易了解的,但計算機很難了解它們。這種現象被稱為語義鴻溝。我們的大腦可以檢視圖像,并在幾秒鐘内了解完整的圖檔。另一方面,計算機将圖像視為一組數字。

在早期,人們試圖把圖像分解成像“模闆”這樣的“可了解的”格式。例如,一張臉總是有一個特定的結構,這個結構在每個人身上都有所保留,比如眼睛的位置和鼻子,或我們的臉的形狀。但是這種方法并不可行,因為當要識别的對象的數量增加時,“模闆”就不會成立。

2012年,深度神經網絡架構赢得了ImageNet的挑戰,這是一個從自然場景中識别物體的重大挑戰。

那麼人們通常使用哪種庫/語言來解決圖像識别問題?一個最近的一項調查發現,最流行的深度學習庫是Python提供的API,其次是Lua中,Java和Matlab的。最流行的庫是:

Caffe

DeepLearning4j

TensorFlow

Theano

Torch

讓我們來看看TensorFlow所提供的功能。 什麼是TensorFlow?

“TensorFlow是一個使用資料流圖進行數值計算的開源軟體庫。圖中的節點表示數學運算,而圖邊表示在它們之間傳遞的多元資料陣列(又稱張量)。靈活的體系結構允許你使用單個API将計算部署到桌面、伺服器或移動裝置中的一個或多個CPU或GPU。

教你用TensorFlow實作神經網絡(附代碼)

如果你之前曾經使用過numpy,那麼了解TensorFlow将會是小菜一碟!numpy和TensorFlow之間的一個主要差別是TensorFlow遵循一個“懶惰”的程式設計範例。它首先建立所有要完成的操作圖形,然後當一個“會話”被調用時,它再“運作”圖形。建構一個計算圖可以被認為是TensorFlow的主要成分。要了解更多關于計算圖的數學構成,請閱讀這篇文章。

TensorFlow不僅僅是一個強大的神經網絡庫。它可以讓你在其上建構其他機器學習算法,如決策樹或k最近鄰。

使用TensorFlow的優點是:

它有一個直覺的結構,因為顧名思義,它有一個“張量流”。 你可以很容易地看到圖的每一個部分。

輕松地在CPU / GPU上進行分布式計算。

平台靈活性。你可以在任何地方運作模型,無論是在移動裝置,伺服器還是PC上。

典型的“張量流”

每個庫都有自己的“實施細節”,即按照其編碼模式編寫的一種方法。例如,在執行scikit-learn時,首先建立所需算法的對象,然後在訓練集上建構一個模型,并對測試集進行預測。例如:

教你用TensorFlow實作神經網絡(附代碼)

正如我剛才所說,TensorFlow遵循一個“懶惰”的方法。

在TensorFlow中運作程式的通常工作流程如下所示:

建立一個計算圖。這可以是TensorFlow支援的任何數學操作。

初始化變量。

建立會話。

在會話中運作圖形。

關閉會話。

接下來,讓我們寫一個小程式來添加兩個數字!

教你用TensorFlow實作神經網絡(附代碼)

在TensorFlow中實作神經網絡

注意:我們可以使用不同的神經網絡體系結構來解決這個問題,但是為了簡單起見,我們需要實作前饋多層感覺器。

神經網絡的常見的實作如下:

定義要編譯的神經網絡體系結構。

将資料傳輸到你的模型。

将資料首先分成批次,然後進行預處理。

然後将其加入神經網絡進行訓練。

顯示特定的時間步數的準确度。

訓練結束後儲存模型以供将來使用。

在新資料上測試模型并檢查其執行情況。

我們的問題是識别來自給定的28x28圖像的數字。我們有一部分圖像用于訓練,剩下的則用于測試我們的模型。是以首先下載下傳資料集,資料集包含資料集中所有圖像的壓縮檔案:train.csv和test.csv。資料集中不提供任何附加功能,隻是以“.png”格式的原始圖像。

我們将使用TensorFlow來建立一個神經網絡模型。是以你應該先在你的系統中安裝TensorFlow。 根據你的系統規格,請參閱官方安裝指南進行安裝。

我們将按照上述模闆進行操作。用Python 2.7核心建立一個Jupyter筆記本,并按照下面的步驟。

導入所有必需的子產品:

教你用TensorFlow實作神經網絡(附代碼)

設定初始值,以便我們可以控制模型的随機性:

教你用TensorFlow實作神經網絡(附代碼)

第一步是設定保管目錄路徑:

教你用TensorFlow實作神經網絡(附代碼)

讓我們看看資料集。這些格式為CSV格式,并且具有相應标簽的檔案名:

教你用TensorFlow實作神經網絡(附代碼)
教你用TensorFlow實作神經網絡(附代碼)

讓我們看看我們的資料是什麼樣的!

教你用TensorFlow實作神經網絡(附代碼)

上面的圖像表示為numpy數組,如下所示:

教你用TensorFlow實作神經網絡(附代碼)

為了更簡單的資料處理,讓我們将所有的圖像存儲為numpy數組:

教你用TensorFlow實作神經網絡(附代碼)

由于這是一個典型的ML問題,為了測試我們模型的正确功能,我們建立了一個驗證集。

教你用TensorFlow實作神經網絡(附代碼)

現在,我們定義一些輔助函數,我們稍後使用它:

教你用TensorFlow實作神經網絡(附代碼)

我們來定義我們的神經網絡架構。我們定義了一個三層神經網絡:輸入,隐藏和輸出。輸入和輸出中神經元的數量是固定的,因為輸入的是28x28圖像,輸出的是10x1向量。我們隐藏層中有500個神經元。這個數字可以根據你的需要而有所不同。閱讀文章以獲得完整的代碼,并深入了解它的工作原理。

原文釋出時間為:2017-11-25