如果你一直關注資料科學/機器學習,你就不能錯過深度學習和神經網絡的熱潮。網際網路公司正在尋找這方面的人,而且從競賽到開源項目,都有巨額獎金。
如果你對深度學習所提供的前景感到興奮,但是還沒有開始,在這裡或許是你開始的第一步。
在這篇文章中,我将介紹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。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyY2Y3cDMhJWYkRWO2YTZjhTOyYWMzUmM5AzM0IWO4cDZkJzNjVTNl9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
如果你之前曾經使用過numpy,那麼了解TensorFlow将會是小菜一碟!numpy和TensorFlow之間的一個主要差別是TensorFlow遵循一個“懶惰”的程式設計範例。它首先建立所有要完成的操作圖形,然後當一個“會話”被調用時,它再“運作”圖形。建構一個計算圖可以被認為是TensorFlow的主要成分。要了解更多關于計算圖的數學構成,請閱讀這篇文章。
TensorFlow不僅僅是一個強大的神經網絡庫。它可以讓你在其上建構其他機器學習算法,如決策樹或k最近鄰。
使用TensorFlow的優點是:
它有一個直覺的結構,因為顧名思義,它有一個“張量流”。 你可以很容易地看到圖的每一個部分。
輕松地在CPU / GPU上進行分布式計算。
平台靈活性。你可以在任何地方運作模型,無論是在移動裝置,伺服器還是PC上。
典型的“張量流”
每個庫都有自己的“實施細節”,即按照其編碼模式編寫的一種方法。例如,在執行scikit-learn時,首先建立所需算法的對象,然後在訓練集上建構一個模型,并對測試集進行預測。例如:
正如我剛才所說,TensorFlow遵循一個“懶惰”的方法。
在TensorFlow中運作程式的通常工作流程如下所示:
建立一個計算圖。這可以是TensorFlow支援的任何數學操作。
初始化變量。
建立會話。
在會話中運作圖形。
關閉會話。
接下來,讓我們寫一個小程式來添加兩個數字!
在TensorFlow中實作神經網絡
注意:我們可以使用不同的神經網絡體系結構來解決這個問題,但是為了簡單起見,我們需要實作前饋多層感覺器。
神經網絡的常見的實作如下:
定義要編譯的神經網絡體系結構。
将資料傳輸到你的模型。
将資料首先分成批次,然後進行預處理。
然後将其加入神經網絡進行訓練。
顯示特定的時間步數的準确度。
訓練結束後儲存模型以供将來使用。
在新資料上測試模型并檢查其執行情況。
我們的問題是識别來自給定的28x28圖像的數字。我們有一部分圖像用于訓練,剩下的則用于測試我們的模型。是以首先下載下傳資料集,資料集包含資料集中所有圖像的壓縮檔案:train.csv和test.csv。資料集中不提供任何附加功能,隻是以“.png”格式的原始圖像。
我們将使用TensorFlow來建立一個神經網絡模型。是以你應該先在你的系統中安裝TensorFlow。 根據你的系統規格,請參閱官方安裝指南進行安裝。
我們将按照上述模闆進行操作。用Python 2.7核心建立一個Jupyter筆記本,并按照下面的步驟。
導入所有必需的子產品:
設定初始值,以便我們可以控制模型的随機性:
第一步是設定保管目錄路徑:
讓我們看看資料集。這些格式為CSV格式,并且具有相應标簽的檔案名:
讓我們看看我們的資料是什麼樣的!
上面的圖像表示為numpy數組,如下所示:
為了更簡單的資料處理,讓我們将所有的圖像存儲為numpy數組:
由于這是一個典型的ML問題,為了測試我們模型的正确功能,我們建立了一個驗證集。
現在,我們定義一些輔助函數,我們稍後使用它:
我們來定義我們的神經網絡架構。我們定義了一個三層神經網絡:輸入,隐藏和輸出。輸入和輸出中神經元的數量是固定的,因為輸入的是28x28圖像,輸出的是10x1向量。我們隐藏層中有500個神經元。這個數字可以根據你的需要而有所不同。閱讀文章以獲得完整的代碼,并深入了解它的工作原理。
原文釋出時間為:2017-11-25