TensorFlow實現神經網路入門篇
如果你一直關注數據科學/機器學習,你就不能錯過深度學習和神經網路的熱潮。互聯網公司正在尋找這方面的人,而且從競賽到開源項目,都有巨額獎金。
如果你對深度學習所提供的前景感到興奮,但是還沒有開始,在這裡或許是你開始的第一步。
在這篇文章中,我將介紹TensorFlow。閱讀本文後,你將能夠理解神經網路的應用,並使用TensorFlow解決現實生活中的問題,本文中的代碼是用Python編寫的,Python最近的火爆也和深度學習有關。
1:何時使用神經網路?
有關神經網路和深度學習的更詳細的解釋, 請看這裡。其「更深」版本正在圖像識別,語音和自然語言處理等諸多領域取得巨大突破。
現在的主要問題是何時使用神經網路?關於這點,你必須記住一些事情:
1.1:神經網路需要大量的信息數據來訓練。將神經網路想像成一個孩子。它首先觀察父母如何走路。然後它才會獨立行走,並且每走一步,孩子都會學習如何執行特定的任務。如果你不讓它走,它可能永遠不會學習如何走路。你可以提供給孩子的「數據」越多,效果就越好。
1.2:當你有適當類型的神經網路來解決問題時。 每個問題都有自己的難點。數據決定了你解決問題的方式。例如,如果問題是序列生成,遞歸神經網路更適合,而如果它是一個圖像相關的問題,你可能會採取卷積神經網路。
1.3:硬體要求對於運行深度神經網路模型是至關重要的。神經網路很早以前就被「發現」了,但是近年來,神經網路一直在發光,這是因為計算能力的強大。如果你想用這些網路解決現實生活中的問題,準備購買一些高性能硬體吧!
2:如何解決神經網路問題?
神經網路是一種特殊類型的機器學習(ML)演算法。因此,與每個ML演算法一樣,它遵循數據預處理,模型構建和模型評估等常規ML工作流程。我列出了一個如何處理神經網路問題的待辦事項清單。
1.檢查神經網路是否可以提升傳統演算法。
2.做一個調查,哪個神經網路架構最適合即將解決的問題。
3.通過你選擇的語言/庫來定義神經網路架構。
4.將數據轉換為正確的格式,並將其分成批。
5.根據你的需要預處理數據。
6.增加數據以增加規模並製作更好的訓練模型。
7.將數據批次送入神經網路。
8.訓練和監測訓練集和驗證數據集的變化。
9.測試你的模型,並保存以備將來使用。
本文中,我將重點關注圖像數據。讓我們先了解一下,然後再研究TensorFlow。
圖像大多排列為3D陣列,尺寸指的是高度,寬度和顏色通道。例如,如果你現在截取了你的電腦的屏幕截圖,則會首先將其轉換為3D數組,然後將其壓縮為PNG或JPG文件格式。
雖然這些圖像對於人來說是相當容易理解的,但計算機很難理解它們。這種現象被稱為語義鴻溝。我們的大腦可以查看圖像,並在幾秒鐘內了解完整的圖片。另一方面,計算機將圖像視為一組數字。
在早期,人們試圖把圖像分解成像「模板」這樣的「可理解的」格式。例如,一張臉總是有一個特定的結構,這個結構在每個人身上都有所保留,比如眼睛的位置和鼻子,或我們的臉的形狀。但是這種方法並不可行,因為當要識別的對象的數量增加時,「模板」就不會成立。
2012年,深度神經網路架構贏得了ImageNet的挑戰,這是一個從自然場景中識別物體的重大挑戰。
那麼人們通常使用哪種庫/語言來解決圖像識別問題?一個最近的一項調查發現,最流行的深度學習庫是Python提供的API,其次是Lua中,Java和Matlab的。最流行的庫是:
Caffe
DeepLearning4j
TensorFlow
Theano
Torch
讓我們來看看TensorFlow所提供的功能。 什麼是TensorFlow?
「TensorFlow是一個使用數據流圖進行數值計算的開源軟體庫。圖中的節點表示數學運算,而圖邊表示在它們之間傳遞的多維數據陣列(又稱張量)。靈活的體系結構允許你使用單個API將計算部署到桌面、伺服器或移動設備中的一個或多個CPU或GPU。「
如果你之前曾經使用過numpy,那麼了解TensorFlow將會是小菜一碟!numpy和TensorFlow之間的一個主要區別是TensorFlow遵循一個「懶惰」的編程範例。它首先建立所有要完成的操作圖形,然後當一個「會話」被調用時,它再「運行」圖形。構建一個計算圖可以被認為是TensorFlow的主要成分。要了解更多關於計算圖的數學構成,請閱讀這篇文章。
TensorFlow不僅僅是一個強大的神經網路庫。它可以讓你在其上構建其他機器學習演算法,如決策樹或k最近鄰。
使用TensorFlow的優點是:
1.它有一個直觀的結構,因為顧名思義,它有一個「張量流」。 你可以很容易地看到圖的每一個部分。
2.輕鬆地在CPU / GPU上進行分散式計算。
3.平台靈活性。你可以在任何地方運行模型,無論是在移動設備,伺服器還是PC上。
3.典型的「張量流」
每個庫都有自己的「實施細節」,即按照其編碼模式編寫的一種方法。例如,在執行scikit-learn時,首先創建所需演算法的對象,然後在訓練集上構建一個模型,並對測試集進行預測。例如:
正如我剛才所說,TensorFlow遵循一個「懶惰」的方法。
在TensorFlow中運行程序的通常工作流程如下所示:
1.建立一個計算圖。這可以是TensorFlow支持的任何數學操作。
2.初始化變數。
3.創建會話。
4.在會話中運行圖形。
5.關閉會話。
接下來,讓我們寫一個小程序來添加兩個數字!
4.在TensorFlow中實現神經網路
注意:我們可以使用不同的神經網路體系結構來解決這個問題,但是為了簡單起見,我們需要實現前饋多層感知器。
神經網路的常見的實現如下:
1.定義要編譯的神經網路體系結構。
2.將數據傳輸到你的模型。
3.將數據首先分成批次,然後進行預處理。
4.然後將其加入神經網路進行訓練。
5.顯示特定的時間步數的準確度。
6.訓練結束後保存模型以供將來使用。
7.在新數據上測試模型並檢查其執行情況。
我們的問題是識別來自給定的28x28圖像的數字。我們有一部分圖像用於訓練,剩下的則用於測試我們的模型。所以首先下載數據集,數據集包含數據集中所有圖像的壓縮文件:train.csv
和test.csv
。數據集中不提供任何附加功能,只是以「.png」格式的原始圖像。
我們將使用TensorFlow來建立一個神經網路模型。所以你應該先在你的系統中安裝TensorFlow。 根據你的系統規格,請參閱官方安裝指南進行安裝。
我們將按照上述模板進行操作。用Python 2.7內核創建一個Jupyter筆記本,並按照下面的步驟。
導入所有必需的模塊:
設置初始值,以便我們可以控制模型的隨機性:
第一步是設置保管目錄路徑:
讓我們看看數據集。這些格式為CSV格式,並且具有相應標籤的文件名:
讓我們看看我們的數據是什麼樣的!
上面的圖像表示為numpy數組,如下所示:
為了更簡單的數據處理,讓我們將所有的圖像存儲為numpy數組:
由於這是一個典型的ML問題,為了測試我們模型的正確功能,我們創建了一個驗證集。
現在,我們定義一些輔助函數,我們稍後使用它:
我們來定義我們的神經網路架構。我們定義了一個三層神經網路:輸入,隱藏和輸出。輸入和輸出中神經元的數量是固定的,因為輸入的是28x28圖像,輸出的是10x1向量。我們隱藏層中有500個神經元。這個數字可以根據你的需要而有所不同。閱讀文章以獲得完整的代碼,並深入了解它的工作原理。
本文由阿里云云棲社區組織翻譯。
文章原標題《An Introduction to Implementing Neural Networks Using TensorFlow》
作者:Faizan Shaikh 數據科學家 印度人 譯者:虎說八道
文章為簡譯,更為詳細的內容,請查看原文
更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎
推薦閱讀:
※Deep Residual Network 深度殘差網路
※深度學習(Deep Learning)基礎概念1:神經網路基礎介紹及一層神經網路的python實現
※SPPNet-引入空間金字塔池化改進RCNN
※擔心的事情還是發生了,AI水軍你根本看不出來
※Python · RNN