天天看點

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

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

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

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

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

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

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

<b>核心邏輯</b>

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

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

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

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

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

淺層神經網絡

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

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

我們将從實作一個簡單的神經網絡開始,以了解TFlearn中的文法。從經典的101問題開始,也就是OR運算符。雖然神經網絡更适合于其他類型的資料,但這是了解其工作原理的一個很好的問題。

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

首先加載庫,然後加載資料并清洗。不管是照片,音頻還是知覺資料,所有的輸入都會被轉化為數字。這些很長的數字清單就是我們神經網絡的輸入。

現在開始設計神經網絡。選擇你的神經網絡層的類型和數量。

然後它會進入學習過程。

神經網絡知曉輸入和輸出,然後自行尋找二者之間的關系。

最後會用訓練好的模型中給到你一個預測值。

下面是這個神經網絡的程式:

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

輸出:

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

第五行和第六行 将上述表中的資料存儲在清單中

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

第七行 初始化神經網絡,并指定輸入資料的次元或者說尺寸

所有的OR運算都是在一對資料中進行的,是以次元是2.

空值是預設值,表示批量的大小

第八行 輸出層

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

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

第十一行 應用回歸

使用優化器選擇合适的算法來最小化成本函數

學習率決定了神經網絡的調整速度,而損失變量決定了如何計算誤差。

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

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

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

選擇你的輸入資料(OR)以及實際的标簽(Y_truth)

Epochs決定了你的神經網絡運作資料的循環次數

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

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

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

輸出層:

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

在每一批中所有資料都将訓練一次,類似于Epoch。如果資料相對記憶體較大,你需要停止分段訓練。損失函數會計算每一次疊代的錯誤數量。

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

Iter指目前資料索引以及輸入項的總和。

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

安裝FloydHub并登陸,下載下傳這份指南中所需的檔案。

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

進入檔案夾并初始化FloydHub:

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

FloydHub會在你的浏覽器打開web面闆,提示你建立一個名為101的新項目。完成後回到終端,再次輸入初始化指令。

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

在FloydHub中增加一個已上傳的公共資料集

data emilwallner/datasets/cifar-10/1:data 指定資料目錄。你可以在FloydHub上檢視該資料集(以及許多其他公共資料集)。

gpu 使用GPU雲計算

tensorboard 激活Tensorboard

mode jupyter Jupyter Notebook模式下運作任務

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

在浏覽器中初始化Jupyter後,點選“start-here.ipnyb”檔案。

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

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

前往你的FloydHub項目,找到Tensorboard連結。

深度神經網絡

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

是以,我們将關注适用于更多神經網絡的高層次概念。

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

你想它能學習如何将信号從噪聲中分離,但是同時遺忘隻在訓練資料中出現的信号。

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

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

為了進一步了解這些概念,我們在CIFAR-10資料集上開展實驗。該資料集包含了10種類别6萬張的圖檔,例如汽車、卡車和鳥。目标是預測一張新的圖檔屬于哪種類别。

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

CIFAR中的示例圖檔

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

輸入層輸出層将圖檔分為10類。隐藏層混合了卷積層、 pooling以及連接配接層。

選擇層數

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

你可以運作你先前下載下傳的檔案夾中相同例子,同樣包括接下來的試驗。

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

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

丢棄層

我們可以這樣了解丢棄層:一些強大的神經元并不決定最終結果,而是由他們配置設定權力。

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

下面是一個有丢棄層的神經網絡的例子。

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

L1  &amp; L2 正則方程

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

批量大小

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

學習率

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

新手神器!不用部署深度學習環境、上傳資料集!(附代碼&amp;視訊教程)

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

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

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

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