1. 程式人生 > >教你用TensorFlow實現神經網路(附程式碼)

教你用TensorFlow實現神經網路(附程式碼)

640?wx_fmt=png&wxfrom=5&wx_lazy=1

來源:雲棲社群

作者:Pavel Surmenok

本文長度為2600字,建議閱讀5分鐘

本文幫助你理解神經網路的應用,並使用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。

0?wx_fmt=gif

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

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

使用TensorFlow的優點是:

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

  • 輕鬆地在CPU / GPU上進行分散式計算。

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

典型的“張量流”

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

640?wx_fmt=png

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

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

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

  • 初始化變數。

  • 建立會話。

  • 在會話中執行圖形。

  • 關閉會話。

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

640?wx_fmt=png

在TensorFlow中實現神經網路

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

神經網路的常見的實現如下:

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

  • 將資料傳輸到你的模型。

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

  • 然後將其加入神經網路進行訓練。

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

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

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

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

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

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

匯入所有必需的模組:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

讓我們看看資料集。這些格式為CSV格式,並且具有相應標籤的檔名:

640?wx_fmt=png

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=png

上面的影象表示為numpy陣列,如下所示:

640?wx_fmt=png

為了更簡單的資料處理,讓我們將所有的影象儲存為numpy陣列:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

編輯:黃繼彥640?wx_fmt=jpeg