新手神器!不用部署深度學習環境、上傳數據集!(附代碼&視頻教程)
開始學習神經網絡時,我花了兩周的時間進行探索,選擇合適的工具,對比不同的雲服務以及檢索在線課程。但回想起來,我還是希望我可以從第一天就能創建神經網絡,這也是這篇文章的目的。
你不需要有任何預備知識。當然如果你對Python,命令行和Jupyter notebook有基礎的了解會對你有所幫助。
深度學習是機器學習的一個分支,它被證明是一種可以在原始數據(如一幅圖、或者一段聲音)中找到固定模型的有效方法。 如果你想對貓和狗的圖像進行分類。不需要具體的編程,它首先會找到圖片中的邊,然後從不同的邊中構建模式。接下來,它會檢測到鼻子,尾巴和爪子。通過這樣的方式,神經網絡最終可以實現對貓和狗進行分類。
但是,結構化的數據可以使用更好的機器學習算法。舉個例子,如果你的excel表中記錄了有序的客戶數據,你希望可以預測他們的下一張訂單,那麼你可以使用傳統的方法,使用一個更簡單的機器學習算法。
想象一個安裝了很多隨機調整齒輪的機器。這些齒輪堆疊在很多層上,而且會相互影響。最初,這個機器無法正常工作。然後隨機地調整齒輪,直到調整到可以給出正確輸出。
然後一個工程師會開始檢查所有的齒輪,然後標記出來哪些齒輪會造成誤差。他會從最後一層的齒輪開始,因為這裏是所有誤差累計的結果。一旦他找到了最後一層的誤差,他就會開始查看前一層。通過這種方法他可以計算出每一個齒輪對於誤差的貢獻值。我們把這個過程稱為反向傳播。
然後這個工程師開始根據之前找到的誤差對每一個齒輪進行調整,然後重新運行整個機器。運行機器,計算誤差,調整齒輪,不斷循環這個過程直到機器給出正確輸出。
預測 – 計算誤差 – 調整預測值 (訓練周期)
神經網絡的運行方式也是如此,有輸入和輸出,然後通過調整齒輪來尋找輸入和輸出之間的關係。給定一個輸入,通過調整齒輪來預測輸出,然後將預測值和真實值進行對比。
神經網絡通過調整齒輪來追求最小誤差(預測值與實際值之間的差異),它會不斷調整齒輪,直到預測值與真實值之間的差異盡可能小。
最小化誤差的一個最佳方法是梯度下降,即通過誤差函數、或者說成本函數來進行誤差的計算。
許多人認為人工神經網絡是我們大腦新皮質的數字化複製品。 這是一個錯誤的觀念。
我們並不知道大腦如何能夠做出這樣的聲明。這隻是神經網絡發明人弗蘭克·羅森布拉特(Frank Rosenblatt)的一個靈感源泉。
淺層神經網絡 輸入-權重-加和-判斷 –> (預測值-實際值)*學習率
與神經網絡模擬器玩一兩個小時,你就可以獲得對其的直觀感受。
我們將從實現一個簡單的神經網絡開始,以了解TFlearn中的語法。從經典的101問題開始,也就是OR運算符。雖然神經網絡更適合於其他類型的數據,但這是了解其工作原理的一個很好的問題。
所有的深度學習程序都遵循同樣的核心邏輯:
- 首先加載庫,然後加載數據並清洗。不管是照片,音頻還是知覺數據,所有的輸入都會被轉化為數字。這些很長的數字列表就是我們神經網絡的輸入。
- 現在開始設計神經網絡。選擇你的神經網絡層的類型和數量。
- 然後它會進入學習過程。
- 神經網絡知曉輸入和輸出,然後自行尋找二者之間的關係。
- 最後會用訓練好的模型中給到你一個預測值。
下麵是這個神經網絡的程序:
輸出:
第一行 以“#”開頭的行表示備注,一般用來解釋代碼
第二行 加載TFlearn庫 通過這個語句我們可以使用穀歌Tensorflow的深度學習函數
第五行和第六行 將上述表中的數據存儲在列表中
每個數字末尾的點會將整數映射到浮點數。它存儲具有十進製值的數字,使計算更加精確。
第七行 初始化神經網絡,並指定輸入數據的維度或者說尺寸
所有的OR運算都是在一對數據中進行的,所以維度是2.
空值是默認值,表示批量的大小
第八行 輸出層
激活函數將過程中的結果映射到輸出層
在這個例子中,我們使用Sigmoid函數將其映射到(0,1)區間範圍內
第十一行 應用回歸
使用優化器選擇合適的算法來最小化成本函數
學習率決定了神經網絡的調整速度,而損失變量決定了如何計算誤差。
第十二行 選擇使用哪個神經網絡
一般情況下也可以用來指定存儲訓練日誌的位置
第十三行 訓練你的神經網絡和模型
選擇你的輸入數據(OR)以及實際的標簽(Y_truth)
Epochs決定了你的神經網絡運行數據的循環次數
如果你設置 snapshot=True,那麼每次循環後都會進行模型驗證
第十四到十八行 使用訓練好的模型進行預測
在這個例子中,返回的是結果是1/True的概率
輸出層:
第一個結果表示[0.]&[0.]組合為真的可能性為4%,以此類推。“Training step”顯示了你訓練了多少批。
在每一批中所有數據都將訓練一次,類似於Epoch。如果數據相對內存較大,你需要停止分段訓練。損失函數會計算每一次迭代的錯誤數量。
SGD指隨機梯度下降法及最小化代價函數方法。
Iter指當前數據索引以及輸入項的總和。
你可以在大多數TFlearn神經網絡中找到上述邏輯和語法。學習這段代碼最好的方法就是修改代碼並產生一些錯誤。
損失曲線顯示了每一次訓練的錯誤量。
你可以通過Tensorboard來可視化每一次實驗,並了解每一個參數是如何影響訓練的。
這裏有一些你可以運行的例子的建議。我推薦你花費幾小時練習這些例子,以更好地適應運行環境以及TFlearn中的參數。
- 增加訓練與迭代次數
- 嚐試添加或改變文檔中提到的每一個函數的參數
例如g = tflearn.fullyconnected(g, 1, activation=’sigmoid’)改成tflearn.fullyconnected(g, 1, activation=’sigmoid’, bias=False)在輸入項增加整數
- 改變輸入層的形狀
- 改變輸出層的激活函數
- 使用不同的梯度下降方法
- 改變神經網絡計算代價的方式
- 用X和Y來替代“AND”和“NOT”邏輯運算
- 例如將最後一項Y_truth從[1.]改為[0.]。為了使其有效,你需要在網絡中增加一層。
- 使其學得更快
- 想辦法使得每一步學習都超過0.1秒
結合Python來使用Tensorflow在深度學習中是最常見的手段。
TFlearn是一個運行在Tensorflow之上的高層次框架。
另一個常見的框架是Keras。這是一個更加健壯的庫,但是我發現TFlearn的語法更加簡潔易懂。
它們都是運行在Tensorflow之上的高層次框架。
你可以使用你的電腦CPU來運行簡單的神經網絡。但是大多數實驗需要運行數個小時甚至幾周。這也是為什麼大多數人通過現代GPU雲服務來進行深度學習。
最簡單的GPU雲服務解決方案是FloydHub(https://www.floydhub.com/)。如果你掌握了基礎的命令行技能,部署FloydHub將不會超過5分鍾。
使用FloyHub文檔來安裝floyd-cli命令行工具。FloydHub還為遇到問題的客戶提供內部客服支持。
讓我們在FloyHub中使用TFlearn、Jupyter Notebook以及Tensorboard來運行你的第一個神經網絡吧!
安裝FloydHub並登陸,下載這份指南中所需的文件。
打開終端,輸入以下命令:
進入文件夾並初始化FloydHub:
FloydHub會在你的瀏覽器打開web麵板,提示你創建一個名為101的新項目。完成後回到終端,再次輸入初始化命令。
現在你可以在FloydHub上運行你的神經網絡任務了。
你可以通過“floyd run”命令進行不同的設置。在我們的案例中,我們希望:
- 在FloydHub中增加一個已上傳的公共數據集
- data emilwallner/datasets/cifar-10/1:data 指定數據目錄。你可以在FloydHub上查看該數據集(以及許多其他公共數據集)。
- gpu 使用GPU雲計算
- tensorboard 激活Tensorboard
- mode jupyter Jupyter Notebook模式下運行任務
OK,開始運行我們的任務:
在瀏覽器中初始化Jupyter後,點擊“start-here.ipnyb”文件。
start-here.ipnyb 包含了一個簡單的神經網絡,可以了解TFlearn語法。它學習了“OR”邏輯,隨後解釋了所有組合。
點擊菜單欄的“Kernel ”下的 “Restart & Run All”。如果你能看到信息,說明它工作正常,你就可以去做其他事情了。
前往你的FloydHub項目,找到Tensorboard鏈接。
深度神經網絡指的是包含一層以上隱藏層的神經網絡。目前有非常多的關於CNN(卷積神經網絡)工作原理的詳細教程。
因此,我們將關注適用於更多神經網絡的高層次概念。
注:該圖不是一個深度神經網絡。它需要一層以上隱藏層。
你想訓練神經網絡來預測未經訓練的數據。它需要能泛化的能力。這是一種介於學習與遺忘之間的平衡。
你想它能學習如何將信號從噪聲中分離,但是同時遺忘隻在訓練數據中出現的信號。
如果神經網絡未經充分學習,它會出現欠擬合現象。與之相反是過擬合現象。它指的是從訓練數據學習過多。
Regularization (正則化)是一種通過遺忘訓練中的特定信號來減少過擬合的方法。
為了進一步理解這些概念,我們在CIFAR-10數據集上開展實驗。該數據集包含了10種類別6萬張的圖片,例如汽車、卡車和鳥。目標是預測一張新的圖片屬於哪種類別。
CIFAR中的示例圖片
通常我們需要挖掘數據、清理數據以及過濾圖片。但是為了簡化過程,我們隻關注神經網絡。你可以在Jupyter notebook中運行安裝的所有例子(https://github.com/emilwallner/Deep-Learning-101)。
輸入層輸出層將圖片分為10類。隱藏層混合了卷積層、 pooling以及連接層。
讓我們來對比下隻有一層的神經網絡和有三層之間的區別。每一層包含卷積層,池層,和關聯層。
你可以通過點擊在菜單欄中的Kernel > Restart & Run All 來運行這些腳本。接著再瞥一眼Tensorboard中的訓練記錄。你會發現有很多層的多準確了15%。較少層的擬合度低 — 證明它學的還不夠。
你可以運行你先前下載的文件夾中相同例子,同樣包括接下來的試驗。
讓我們看一眼準確度和驗證集的準確度。深度學習中最好的實踐是將數據集一分為二,一部分用作訓練這個神經網絡,剩下的則用作驗證它。通過這種方法可以告訴我們神經網絡在預測新數據中表現如何,或是類推的能力。
就如你所見,訓練數據的準確度高於驗證數據集。這個神經網絡包含了背景噪聲和其他阻礙預測新圖像的細節。
為解決過擬合問題,你可以懲罰複雜方程並在神經網絡中增加噪聲。普遍解決這個的正則化技術有丟棄層和懲戒複雜方程。
我們可以這樣理解丟棄層:一些強大的神經元並不決定最終結果,而是由他們分配權力。
神經網絡被迫使去學習一些獨立的表現。當做最終的預測時,它則有一些不同的模型去學習。
下麵是一個有丟棄層的神經網絡的例子。
在這項對比中,兩個神經網絡是一樣的除了其中一個有丟棄層,另一個沒有。
在神經網絡中的每一層中,神經元變得更依賴於彼此。某些神經元比其他的更有影響力。丟棄層隨機的丟棄部分神經元。這樣,每一個神經元需要為最終輸出提供不同的貢獻。
另一個流行的預防過擬合的方式是在每一層中運用L1 或L2 正則方程。
比方你想描述一匹馬,如果這個描述太仔細,你則會排除掉太多不同形態的馬。但是如果太籠統則可能包括進來很多別的動物。L1 和L2 正則化幫助我們的網絡去做這種區分。
如果我們與之前試驗類似的對比,我們會得到相似的結果。
有正則化方程的神經網絡表現的比沒有的要好。
正則化方程L2 懲戒方程太過複雜。它測量每一個方程對於最終輸出的貢獻量,接著懲罰係數大的方程。
另一個重要參數是批量大小,在每一步訓練中的數據量。下麵是一組大批量數據與小批量數據的對比。
就如你所見,大批量所需的周期更少但在訓練中更精確。對比之下,小批量更隨機但需要消耗更多步來補償。
大批量不需要很多學習步驟。但是,你需要更多存儲空間和時間去計算每一步。
最後一個試驗是對比大,中,小不同學習率的網絡。
學習率因其影響力被視為最重要的一個參數。它規範了如何在每一步學習過程中調節預測中的變化。如果這個學習率太高或者太低都無法收斂,就如上圖的大學習率一般。
設計神經網絡沒有特定的方式。很多是要通過試驗來決定。看看別人如何增加層數和如何調節高階參數的。
如果你有強大的計算能力,你可以設計一個程序和調節高階參數。
當你完成了運行工作,你應當為你的GPU雲降低運轉速度比如通過取消FloydHub網頁儀表盤來結束工作。
在TFlearn的官方示例中(https://github.com/tflearn/tflearn/tree/master/examples/images),你能感受到一些表現優異的卷積神經網絡。試著運用其中一些方式去提高CIFAR-10數據庫的驗證集準確率。目前最優的結果是96.53%(Graham,2014)。
學習Python的語法和熟悉它的命令語句是非常值得的一件事。這可以有效減少不必要的認知負荷從而全神貫注於深度學習概念上。從Codecademy的Python課開始,接著做一些命令語句練習。如果隻做這一件事,你花不到三天就能掌握。
原文發布時間為:2017-11-8
本文作者:Emil Wallnér
最後更新:2017-11-09 12:03:48