閱讀753 返回首頁    go 阿裏雲 go 技術社區[雲棲]


新手神器!不用部署深度學習環境、上傳數據集!(附代碼&視頻教程)

深度學習的浪潮在五年前開始興起。隨著計算能力的爆炸型增長和幾個成功的案例,深度學習引起了大肆宣傳。深度學習技術可以用來駕駛車輛,在Atari遊戲中進行人機對抗,以及診斷癌症。

0?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1

開始學習神經網絡時,我花了兩周的時間進行探索,選擇合適的工具,對比不同的雲服務以及檢索在線課程。但回想起來,我還是希望我可以從第一天就能創建神經網絡,這也是這篇文章的目的。

你不需要有任何預備知識。當然如果你對Python,命令行和Jupyter notebook有基礎的了解會對你有所幫助。

深度學習是機器學習的一個分支,它被證明是一種可以在原始數據(如一幅圖、或者一段聲音)中找到固定模型的有效方法。 如果你想對貓和狗的圖像進行分類。不需要具體的編程,它首先會找到圖片中的邊,然後從不同的邊中構建模式。接下來,它會檢測到鼻子,尾巴和爪子。通過這樣的方式,神經網絡最終可以實現對貓和狗進行分類。

但是,結構化的數據可以使用更好的機器學習算法。舉個例子,如果你的excel表中記錄了有序的客戶數據,你希望可以預測他們的下一張訂單,那麼你可以使用傳統的方法,使用一個更簡單的機器學習算法。

想象一個安裝了很多隨機調整齒輪的機器。這些齒輪堆疊在很多層上,而且會相互影響。最初,這個機器無法正常工作。然後隨機地調整齒輪,直到調整到可以給出正確輸出。

然後一個工程師會開始檢查所有的齒輪,然後標記出來哪些齒輪會造成誤差。他會從最後一層的齒輪開始,因為這裏是所有誤差累計的結果。一旦他找到了最後一層的誤差,他就會開始查看前一層。通過這種方法他可以計算出每一個齒輪對於誤差的貢獻值。我們把這個過程稱為反向傳播。

然後這個工程師開始根據之前找到的誤差對每一個齒輪進行調整,然後重新運行整個機器。運行機器,計算誤差,調整齒輪,不斷循環這個過程直到機器給出正確輸出。

6a7372972e7a2e481ff32bd7d0506f89c2f2165b

預測 – 計算誤差 – 調整預測值 (訓練周期)


神經網絡的運行方式也是如此,有輸入和輸出,然後通過調整齒輪來尋找輸入和輸出之間的關係。給定一個輸入,通過調整齒輪來預測輸出,然後將預測值和真實值進行對比。

神經網絡通過調整齒輪來追求最小誤差(預測值與實際值之間的差異),它會不斷調整齒輪,直到預測值與真實值之間的差異盡可能小。

最小化誤差的一個最佳方法是梯度下降,即通過誤差函數、或者說成本函數來進行誤差的計算。

許多人認為人工神經網絡是我們大腦新皮質的數字化複製品。 這是一個錯誤的觀念。

我們並不知道大腦如何能夠做出這樣的聲明。這隻是神經網絡發明人弗蘭克·羅森布拉特(Frank Rosenblatt)的一個靈感源泉。

007563e0dc604ea414ac42a71933cad4ccde827f

淺層神經網絡 輸入-權重-加和-判斷 –> (預測值-實際值)*學習率


與神經網絡模擬器玩一兩個小時,你就可以獲得對其的直觀感受。

我們將從實現一個簡單的神經網絡開始,以了解TFlearn中的語法。從經典的101問題開始,也就是OR運算符。雖然神經網絡更適合於其他類型的數據,但這是了解其工作原理的一個很好的問題。

69b46ffa6c407ee37de1e5a97d1c4ecb3089c2f8

所有的深度學習程序都遵循同樣的核心邏輯:

  • 首先加載庫,然後加載數據並清洗。不管是照片,音頻還是知覺數據,所有的輸入都會被轉化為數字。這些很長的數字列表就是我們神經網絡的輸入。
  • 現在開始設計神經網絡。選擇你的神經網絡層的類型和數量。
  • 然後它會進入學習過程。
  • 神經網絡知曉輸入和輸出,然後自行尋找二者之間的關係。
  • 最後會用訓練好的模型中給到你一個預測值。

下麵是這個神經網絡的程序:

5b9b042782264e18079d6a6c331163950d24513e

輸出:

bf969a993981335b3122f6d36f032e94bd1787c7

第一行 以“#”開頭的行表示備注,一般用來解釋代碼

第二行 加載TFlearn庫 通過這個語句我們可以使用穀歌Tensorflow的深度學習函數

第五行和第六行 將上述表中的數據存儲在列表中

每個數字末尾的點會將整數映射到浮點數。它存儲具有十進製值的數字,使計算更加精確。

第七行 初始化神經網絡,並指定輸入數據的維度或者說尺寸

所有的OR運算都是在一對數據中進行的,所以維度是2.

空值是默認值,表示批量的大小

第八行 輸出層

激活函數將過程中的結果映射到輸出層

在這個例子中,我們使用Sigmoid函數將其映射到(0,1)區間範圍內

第十一行 應用回歸

使用優化器選擇合適的算法來最小化成本函數
學習率決定了神經網絡的調整速度,而損失變量決定了如何計算誤差。

第十二行 選擇使用哪個神經網絡

一般情況下也可以用來指定存儲訓練日誌的位置

第十三行 訓練你的神經網絡和模型

選擇你的輸入數據(OR)以及實際的標簽(Y_truth)

Epochs決定了你的神經網絡運行數據的循環次數

如果你設置 snapshot=True,那麼每次循環後都會進行模型驗證

第十四到十八行 使用訓練好的模型進行預測

在這個例子中,返回的是結果是1/True的概率

輸出層:

第一個結果表示[0.]&[0.]組合為真的可能性為4%,以此類推。“Training step”顯示了你訓練了多少批。

在每一批中所有數據都將訓練一次,類似於Epoch。如果數據相對內存較大,你需要停止分段訓練。損失函數會計算每一次迭代的錯誤數量。

SGD指隨機梯度下降法及最小化代價函數方法。

Iter指當前數據索引以及輸入項的總和。

你可以在大多數TFlearn神經網絡中找到上述邏輯和語法。學習這段代碼最好的方法就是修改代碼並產生一些錯誤。

7e77844c305fec673ed592c2c3c9751d99ee02ed

損失曲線顯示了每一次訓練的錯誤量。

你可以通過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還為遇到問題的客戶提供內部客服支持。

826da5b2fa53ee16258242c33917e1cc8f0c51b0

讓我們在FloyHub中使用TFlearn、Jupyter Notebook以及Tensorboard來運行你的第一個神經網絡吧!

安裝FloydHub並登陸,下載這份指南中所需的文件。

打開終端,輸入以下命令:

1eccf54b4b715a8e9e19d4c9e95480d3931aa9db

進入文件夾並初始化FloydHub:

9caa11af209a947a698515b13ece010a217f4805

FloydHub會在你的瀏覽器打開web麵板,提示你創建一個名為101的新項目。完成後回到終端,再次輸入初始化命令。

cc3b0090c2d56bc55f0696540d854459cc63105f

現在你可以在FloydHub上運行你的神經網絡任務了。

你可以通過“floyd run”命令進行不同的設置。在我們的案例中,我們希望:

  • 在FloydHub中增加一個已上傳的公共數據集
  • data emilwallner/datasets/cifar-10/1:data 指定數據目錄。你可以在FloydHub上查看該數據集(以及許多其他公共數據集)。
  • gpu 使用GPU雲計算
  • tensorboard 激活Tensorboard
  • mode jupyter Jupyter Notebook模式下運行任務

OK,開始運行我們的任務:

19567cc9c0654f718757da115d4e3d81c2b4012b

在瀏覽器中初始化Jupyter後,點擊“start-here.ipnyb”文件。

start-here.ipnyb 包含了一個簡單的神經網絡,可以了解TFlearn語法。它學習了“OR”邏輯,隨後解釋了所有組合。

點擊菜單欄的“Kernel ”下的 “Restart & Run All”。如果你能看到信息,說明它工作正常,你就可以去做其他事情了。

前往你的FloydHub項目,找到Tensorboard鏈接。

深度神經網絡指的是包含一層以上隱藏層的神經網絡。目前有非常多的關於CNN(卷積神經網絡)工作原理的詳細教程。

因此,我們將關注適用於更多神經網絡的高層次概念。

d0a22120bc8b8638840d1bf765aec9b6543c8608

注:該圖不是一個深度神經網絡。它需要一層以上隱藏層。


你想訓練神經網絡來預測未經訓練的數據。它需要能泛化的能力。這是一種介於學習與遺忘之間的平衡。

你想它能學習如何將信號從噪聲中分離,但是同時遺忘隻在訓練數據中出現的信號。

如果神經網絡未經充分學習,它會出現欠擬合現象。與之相反是過擬合現象。它指的是從訓練數據學習過多。

Regularization (正則化)是一種通過遺忘訓練中的特定信號來減少過擬合的方法。

為了進一步理解這些概念,我們在CIFAR-10數據集上開展實驗。該數據集包含了10種類別6萬張的圖片,例如汽車、卡車和鳥。目標是預測一張新的圖片屬於哪種類別。

1bdb940e35a96a32e98c07521fb06ace9a923e43

CIFAR中的示例圖片

通常我們需要挖掘數據、清理數據以及過濾圖片。但是為了簡化過程,我們隻關注神經網絡。你可以在Jupyter notebook中運行安裝的所有例子(https://github.com/emilwallner/Deep-Learning-101)

輸入層輸出層將圖片分為10類。隱藏層混合了卷積層、 pooling以及連接層。

讓我們來對比下隻有一層的神經網絡和有三層之間的區別。每一層包含卷積層,池層,和關聯層。

43184fe7c0b347defa7affffec4bf3079324a30d

你可以通過點擊在菜單欄中的Kernel > Restart & Run All 來運行這些腳本。接著再瞥一眼Tensorboard中的訓練記錄。你會發現有很多層的多準確了15%。較少層的擬合度低 — 證明它學的還不夠。

你可以運行你先前下載的文件夾中相同例子,同樣包括接下來的試驗。

35263ad47b5ad42f2f131d1337f37f45b12726c5

讓我們看一眼準確度和驗證集的準確度。深度學習中最好的實踐是將數據集一分為二,一部分用作訓練這個神經網絡,剩下的則用作驗證它。通過這種方法可以告訴我們神經網絡在預測新數據中表現如何,或是類推的能力。

就如你所見,訓練數據的準確度高於驗證數據集。這個神經網絡包含了背景噪聲和其他阻礙預測新圖像的細節。

為解決過擬合問題,你可以懲罰複雜方程並在神經網絡中增加噪聲。普遍解決這個的正則化技術有丟棄層和懲戒複雜方程。

我們可以這樣理解丟棄層:一些強大的神經元並不決定最終結果,而是由他們分配權力。

神經網絡被迫使去學習一些獨立的表現。當做最終的預測時,它則有一些不同的模型去學習。

下麵是一個有丟棄層的神經網絡的例子。

1c81a0b9258ee3d39d27d490c3e301d1eeec8a7a

在這項對比中,兩個神經網絡是一樣的除了其中一個有丟棄層,另一個沒有。

d768af850d149a80b998151c733377ae86d8bd1c

在神經網絡中的每一層中,神經元變得更依賴於彼此。某些神經元比其他的更有影響力。丟棄層隨機的丟棄部分神經元。這樣,每一個神經元需要為最終輸出提供不同的貢獻。

另一個流行的預防過擬合的方式是在每一層中運用L1 或L2 正則方程。

比方你想描述一匹馬,如果這個描述太仔細,你則會排除掉太多不同形態的馬。但是如果太籠統則可能包括進來很多別的動物。L1 和L2 正則化幫助我們的網絡去做這種區分。

53ea465ab8479d9d6b920758a006b7edc6d17d0e

如果我們與之前試驗類似的對比,我們會得到相似的結果。

a8a2d117db697d0562be303b0c4af95cf87653f0

有正則化方程的神經網絡表現的比沒有的要好。

正則化方程L2 懲戒方程太過複雜。它測量每一個方程對於最終輸出的貢獻量,接著懲罰係數大的方程。

另一個重要參數是批量大小,在每一步訓練中的數據量。下麵是一組大批量數據與小批量數據的對比。

22bdc019221bcb91b4c602158ca3893299b00755

就如你所見,大批量所需的周期更少但在訓練中更精確。對比之下,小批量更隨機但需要消耗更多步來補償。

大批量不需要很多學習步驟。但是,你需要更多存儲空間和時間去計算每一步。

最後一個試驗是對比大,中,小不同學習率的網絡。

21dbc850c5d6e52add583fac495b7fbfd3f57797

學習率因其影響力被視為最重要的一個參數。它規範了如何在每一步學習過程中調節預測中的變化。如果這個學習率太高或者太低都無法收斂,就如上圖的大學習率一般。

設計神經網絡沒有特定的方式。很多是要通過試驗來決定。看看別人如何增加層數和如何調節高階參數的。

如果你有強大的計算能力,你可以設計一個程序和調節高階參數。

當你完成了運行工作,你應當為你的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

本文來自雲棲社區合作夥伴“數據派THU”,了解相關信息可以關注“數據派THU”微信公眾號

最後更新:2017-11-09 12:03:48

  上一篇:go  包你拚紅包小程序係統解析
  下一篇:go  病毒已死!錢盾構建“全流程屏障”治理黑灰產業