當前位置:
首頁 > 科技 > 基於Keras的Deep Learning學習入門指南

基於Keras的Deep Learning學習入門指南

GIF/1.7M

「機器人圈」導覽:關於深度學習(Deep Learning)現如今在AI領域有著舉足輕重的地位,而怎樣才能學好深度學習呢?擁有量子物理博士學位的Piotr Migda?是一個數據科學自由職業者,他積极參与有天賦的教育,發展量子遊戲,並在deepsense.io上擔任數據科學講師,他對於深度學習有著不一般的教學經驗,下面就和機器人圈一起來學習一下吧。

人們做一件事情,往往帶有一定的目的性,對於深度學習,無論你開始著手的初衷是想開啟一段職業生涯,還是僅僅是想進行一次探險(例如,檢測可疑的對象),或者是想在機器接管世界之前先對它們有一個了解(just a joke),可以說你都可以在這篇文章中找到你想要的答案。本文的目標不在於神經網路教學本身,而是提供一個概述,並指出其中有用的資源。

不要害怕人工神經網路——它是很容易啟動的!如果真要開始學習的話,所有你需要具備的就是真正的基本編程,非常簡單的數學知識和幾個機器學習概念的知識。接下來,我將一一解釋該如何從這些要求中著手。

在我看來,最好的方法是從高級互動方式(另見:《高中生量子力學教材》和《Quantum Game with Photons》。因此,我建議從Keras的圖像識別任務開始進行,這是一個普遍的Python神經網路庫。當然,如果你想要用比Keras更少的代碼來訓練神經網路,唯一可行的選擇就是使用鴿子(pigeons)。是的,我是認真的:鴿子識別癌症的水平可是要比肩人類科學家!

什麼是深度學習?為什麼它如此炫酷?

深度學習是使用多層人工神經網路的機器學習技術的名稱。人們常常會使用人工智慧這個術語,但除非你想要聽起來很科幻,否則它就是為那些目前被認為是「對機器而言過於困難」的問題預留的,一個不斷快速發展的前沿領域。這是一個在過去幾年中得以大爆發的領域,特別是在視覺識別任務(包括許多其他任務)中可以企及人類的準確度,參見:

?電子前沿基金會的AI研究進展情況(Measuring the Progress of AI Research)(2017)

與量子計算或核聚變不同,它是一種正在應用的技術,而不是未來的一些可能性。有一個經驗法則:

一個正常人可以在1秒鐘內完成的任何操作,現在我們都可以使用AI的自動化完成。-—吳恩達在推文中說道。

有些人甚至更進一步,將這種說法外延到科學家領域。像Google和Facebook這樣的公司處於如今的領先地位並不奇怪。事實上,每隔幾個月我就會被超出我期望的東西驚訝到,例如:

?維基百科條目和LaTeX文章中所談及的生成假莎士比亞式文章的循環神經網路(RNN)的不合理有效性。

?藝術風格遷移的神經演算法 (視頻!)

?臉部實時捕獲和重現

?彩色圖像著色

?用於逼真圖像生成的即插即用生成網路

?皮膚病學家對皮膚癌的分類以及其他醫療診斷工具

?圖像平移(pix2pix)——素描到照片

?用機器器繪製貓,狗等動物的草圖

這看起來像是一些巫術。如果你好奇什麼是神經網路,請觀看以下這一系列視頻,從而得到系統的介紹:

?Stephen Welch揭秘神經網路

?J Alamma的神經網路基礎的視覺和交互指南

這些技術都是缺乏數據的(data-hungry)。查看Higgs數據集上的邏輯回歸,隨機森林和深度學習的AUC分數曲線(數據點以百萬為單位):

一般來說,即使有大量數據,深度學習也比其他技術更好,比如隨機森林或增強樹等樹型。

讓我們試一下!

我需要一些Skynet才能運行嗎?當然不用——像其他的軟體一樣,你甚至可以在瀏覽器中進行:

?TensorFlow Playground用於點分離,具有可視界面

?ConvNetJS用於數字和圖像識別

?Keras.js演示—在瀏覽器中可視化和使用真實網路(例如ResNet-50)

或者,如果你想在Python中使用Keras,請參閱這個最小的示例—只是為了讓你確信你可以在自己的電腦上使用它。

Python和機器學習

我提到基礎Python和機器學習以此來作為一個要求。在對Python中的數據科學以及統計和機器學習的介紹部分,這些都涵蓋在內。

對於Python而言,如果你已經擁有Anaconda distribution(涵蓋大多數數據科學軟體包),那麼你唯一需要做的就是安裝TensorFlow和Keras。

而在涉及機器學習的時候,在開始著手學習深度學習之前你並不需要學習許多技巧。儘管如此,如果可以用更簡單的方法來解決給定的問題,那將是一個很好的實踐,再好不過了。例如,隨機森林通常可看作是一個鎖匙(lockpick),在許多問題上都是開箱即用的。你需要了解的是我們為什麼要進行訓練,而後去測試分類器(以驗證其預測能力)。想要得到它的要點,那就從這個基於樹的美麗動畫開始:

?Stephanie Yee和Tony Chu的機器學習視覺介紹(Visual introduction to machine learning)

此外,理解邏輯回歸(logistic regression)也是一個不錯的選擇,要知道,邏輯回歸幾乎是任何神經網路分類的基礎。

數學

深度學習(即具有多層次的神經網路)主要使用非常簡單的數學運算。這裡有幾個示例,你可以在幾乎任何網路中找到(只是看一看這個列表,請不要被嚇到):

?向量,矩陣,多維數組

?加法,乘法

?卷取提取和處理局部模式

?激活函數:sigmoid,tanh或添加非線性的reLU(ReLU to add non-linearity)

?Softmax將向量轉換為概率

?對數損失(交叉熵)以智能方式懲罰錯誤的猜測(另見Kullback-Leibler發散解釋)

?梯度和鏈規則(反向傳播),用於優化網路參數

?隨機梯度下降及其變體(例如動量)。

如果你的專業背景是數學,統計學,物理學或信號處理的話——很有可能你已經知道了足夠多的知識足以去開始學習!

而如果你與數學的最近一次接觸還是在高中,那麼也別擔心。其實數學很簡單,用於數字識別的卷積神經網路都可以在電子表格(沒有macros)中實現,請參閱:Deep Spreadsheets with ExcelNet。這只是一個原則性的解決方案—不僅效率不高,而且還缺乏最關鍵的部分—訓練新網路的能力。

矢向量運算的基礎不僅對於深度學習至關重要,而且對許多其他機器學習技術也是至關重要的(例如在我寫的word2vec中)。而想要了解它,我建議從以下之一開始:

?J.Str?m,K.?str?m和T. Akenine-M?ller著作的Immersive Linear Algebra —一個具有完全互動式圖形的線性代數書

?應用數學和機器學習基礎:深度學習書本中的線性代數

?Brendan Fortuner著作的《深度學習線性代數作弊表》

由於書中有很多地方引用到NumPy,那麼學習它的基礎知識想必是很有用的:

?Nicolas P. Rougier著作的《從Python到Numpy》

?SciPy課程:NumPy數組對象

同時,回想一下其中所蘊含的道理,就像數學家們所認為的那樣。從魔術般的工作代碼開始,處理像樂高積木這樣的神經網路層是完全可以的。

架構

有幾個深度學習庫是非常受歡迎的,包括TensorFlow,Theano,Torch和Caffe。他們每個都有Python介面(當然,現在Torch中也有:PyTorch)。

那麼,我們該選擇哪個呢?首先,像往常一樣,把所有微妙的性能基準拋諸腦後,因為過早的優化是萬惡之源。最重要的是從易於編寫(和閱讀)的那一個開始,從一個有許多在線資源,從一個可以安裝在你的計算機上而不會出現過多BUG的那一個開始。

請記住,核心框架是具有GPU支持的多維數組表達式編譯器。目前的神經網路可以這樣表達。然而,如果你只是希望使用神經網路,通過最小功率規則,我建議從一個神經網路框架開始。例如……

Keras

如果你喜歡Python哲學(簡潔,具有可讀性,一種首選的做法),那麼Keras就是為你量身定做的。它是使用TensorFlow或Theano作為其後端的神經網路的高級庫。另外,如果你想有一個宣傳畫面,有可能會出現一個有偏差(或過度擬合)的排名:

?深度學習框架狀態(來自GitHub指標), 2017年4月。——弗朗索瓦?喬克(Keras創造者)

如果你想諮詢不同的來源,基於arXiv文件而不是GitHub的活動,請參閱Andrej Karpathy的機器學習趨勢。流行是很重要的,這意味著如果你想搜索一個網路架構,搜索它(例如UNet Keras)可能會返回一個示例。那麼應該從哪裡開始學習呢?關於Keras的文檔很好,而且它的博客是一個有價值的資源。對於Jupyter筆記本中使用Keras深入學習的完整互動介紹,我真的推薦應該去看看:

?由Valerio Maggio著作的基於Keras和TensorFlow的深度學習

如果你想要較為簡短一些的,請嘗試以下其中一項:

?Erik Reppel著作的使用Keras和Cats可視化卷積神經網路的部分

?PetarVeli?kovi?著作的完全初學者的深度學習:基於Keras的卷積神經網路

?Jason Brownlee著作的在Python中使用複雜的神經網路的手寫數字識別(Theano張量維度)

Keras有幾個附件,這對於學習它來說尤其有用。我為順序模型創建ASCII匯總,以顯示網路內的數據流(比

model.summary()

更好)。它顯示層數,數據維數(x, y, channels) 和空閑參數數量(待優化)。例如,對於用於數字識別的網路,它可能如下所示:

OPERATION DATA DIMENSIONS WEIGHTS(N) WEIGHTS(%) Input ##### 32 32 3 Conv2D |/ ------------------- 896 0.1% relu ##### 32 32 32 Conv2D |/ ------------------- 9248 0.7% relu ##### 30 30 32 MaxPooling2D Y max ------------------- 0 0.0% ##### 15 15 32 Dropout | || ------------------- 0 0.0% ##### 15 15 32 Conv2D |/ ------------------- 18496 1.5% relu ##### 15 15 64 Conv2D |/ ------------------- 36928 3.0% relu ##### 13 13 64 MaxPooling2D Y max ------------------- 0 0.0% ##### 6 6 64 Dropout | || ------------------- 0 0.0% ##### 6 6 64 Flatten ||||| ------------------- 0 0.0% ##### 2304 Dense XXXXX ------------------- 1180160 94.3% relu ##### 512 Dropout | || ------------------- 0 0.0% ##### 512 Dense XXXXX ------------------- 5130 0.4% softmax ##### 10

你可能也會對使用keras-tqdm的更好的進度條感興趣,用quiver來探索每一層的激活函數,使用keras-vis來檢測attention 映射或將Keras模型轉換為JavaScript,並在Keras.js的瀏覽器中運行。說到語言,還有到Keras的R介面。

TensorFlow

如果不是Keras,那麼我建議從單一的TensorFlow開始。這是一個級別更低和更為冗長的工具,但是可以直接優化各種多維數組(還有張量)操作。如下展示一些好的資源:

?官方的TensorFlow教程非常好

?MartinG?rner著作的學習TensorFlow和深度學習。

?Aymeric Damien著作的為初學者提供TensorFlow教程和示例(使用Python 2.7)

?Nathan Lintz著作的使用Google的TensorFlow框架的簡單教程

無論如何,TensorBoard可以輕鬆追蹤訓練過程。它也可以通過回調與Keras一起使用。

其他

Theano與TensorFlow類似,但有點老了,更難開始著手。例如,你需要手動寫入變數的更新。典型的神經網路層不包括在內,所以經常使用諸如Lasagne這樣的庫。如果你正在尋找一個開始的地方,我喜歡下面這個介紹:

Marek Rei著作的Theano教程

同時,如果你在Torch或PyTorch中看到一些不錯的代碼,不要害怕安裝並運行它!

數據集

每個機器學習問題都需要數據。你不能只是告訴它「檢測這張照片中是否有貓」,並期望電腦告訴你答案。你需要顯示許多貓的實例,以及不包含貓的圖片,並且(希望)它將學習將其概括為其他情況。所以,你需要一些數據才能開始。這不是機器學習或只是深度學習的缺點 —它是任何學習的基本屬性!

在潛入未知的水域之前,不妨先看一些流行的數據集。其中它們最關鍵部分就是它們是非常受歡迎的。這意味著你可以找到很多例子。並保證這些問題可以用神經網路解決。

MNIST

許多好的想法在MNIST(例如批處理規範)上將無法正常工作。反之,許多壞主意也許可以在MNIST上工作,而不會轉移到真正的[計算機視覺]上。

—Fran?ois Chollet』s tweet

不過,我建議從包含在keras.datasets中的MNIST數字識別數據集(60k灰度28x28圖像)開始。不需要掌握它,只是為了得到它的工作原理(或者測試本地機器上的Keras的基礎知識)。

notMNIST

事實上,我曾經提出,AI工作者面臨的最棘手的挑戰是回答這個問題:「A」和「I」是什麼?

——Douglas R. Hofstadter(1995)

一個更有趣的數據集,對於經典機器學習演算法來說更加困難,它是notMNIST(字母A - j來自奇怪的字體)。如果你想從它開始,這裡是我的代碼,它是在Keras中進行的notMNIST載入和邏輯回歸。

CIFAR

如果你對圖像識別感興趣,則有CIFAR數據集,32x32照片的數據集(也可以在keras.datasets中)。它有兩個版本:10個簡單的課程(包括貓,狗,青蛙和飛機)和100個更難和更細微的課程(包括海狸,海豚,水獺,印章和鯨魚)。我強烈建議從CIFAR-10開始,簡單的版本。當心,更複雜的網路可能需要相當長的一段時間(在我7歲時在Macbook Pro的CPU上運行時間為12小時)。

更多

深度學習需要大量數據。如果要從頭開始訓練網路,即使是低解析度(32x32),也可能需要多達10k左右的圖像。特別是如果數據很少,就不能保證網路會學到任何東西。那麼有什麼辦法可以解決這個問題呢?

?使用非常低的解析度(如果你的眼睛可以看到它,不需要使用更高的解析度)

?獲得大量數據(對於像256x256這樣的圖像可能是:數百萬個實例)

?重新訓練已經看到很多的網路

?產生更多的數據(包括旋轉、移位和變形)

通常,它是這是所提到的一切東西的組合。

站在巨人的肩膀上

創建新的神經網路與烹飪有很多共同之處—有典型的成分(層)和配方(流行的網路架構)。最重要的烹飪比賽是ImageNet大型視覺識別挑戰賽,從50萬個照片數據集中識別出數百個類。看看這些神經網路架構,通常使用224x224x3的輸入(Eugenio Culurciello的圖表):

圓的大小代表參數的數量(很多!)。不過,沒有提到SqueezeNet,這種架構大大減少了參數的數量(例如減少了50倍)。

用於圖像分類的幾個關鍵網路可以從keras.applications模塊輕鬆載入:Xception,VGG16,VGG19,ResNet50,InceptionV3。其他一些不是即插即用,但仍然很容易在網上找到—是的,在Keras有SqueezeNet。這些網路有兩個目的:

?它們提供了有用的構建塊和架構

?當使用具有預先訓練權重的架構時,它們是重新訓練(所謂的遷移學習)的最佳候選

圖像的其他一些重要網路架構:

?U-Net:生物醫學圖像分割的卷積網路

視網膜血管分割與卷積神經網路 -——基於Keras實現

利用Keras,為Kaggle的超聲神經細分競爭提供深入的學習指導

?一種藝術風格的神經演算法

《在Keras中執行神經風格遷移和神經塗鴉》——Somshubra Majumdar

?《CNN在圖像分割中的簡史:從R-CNN到Mask R-CNN》——Dhruv Parthasarathy

另一套見解:

?《神經網路動物園》——Fjodor van Veen

?如何訓練你的深度神經網路——有多少層,參數等

基礎

對於非常小的問題(例如MNIST,notMNIST),你可以使用個人計算機—即使它是筆記本電腦,計算也是在CPU上進行的。

對於小問題(例如,CIFAR,不合理的RNN),你仍然可以使用PC,但需要更多的耐心和權衡。

對於中等和較大的問題,基本上唯一的辦法是使用具有強大圖形處理器(GPU)的機器。例如,我們花了2天時間來訓練一個衛星圖像處理的模型來進行Kaggle的競賽,請參閱:

?ArkadiuszNowaczyński的基於圖像分割的衛星圖像深度學習

在一個強大的CPU上,將需要花費幾周的時間,請看:

?Justin Johnson的流行卷積神經網路模型的基準

使用強大GPU的最簡單和最便宜的方法是每小時租一台遠程機器。你可以使用亞馬遜(它不僅是一個書店!),這裡有一些指導:

?亞馬遜EC2上的Keras與GPU—一個循序漸進的指導,由Mateusz Sieniawski,我的學員完成

?在AWS上的GPU上運行Jupyter筆記本電腦:Francois Chollet的入門指南

進一步學習

我鼓勵你與代碼之間進行交互。例如,notMNIST或CIFAR-10可以是很好的起點。有時,最好的開始是從別人的代碼開始運行,然後查看修改參數時會發生什麼。

為了學習如何運作,這一個是傑作:

?由Andrej Karpathy編寫的CS231n:卷積神經網路的視覺識別和演講視頻

對於書籍來說,有一個很好的例子,從介紹數學和機器學習的學習環境開始(甚至以我喜歡的方式涵蓋對數丟失和熵)!)

?《深度學習》,麻省理工學院出版社的,這是由Ian Goodfellow,Yoshua Bengio和Aaron Courville聯合編輯的。

或者,你可以使用(它可能有利於互動式材料的介紹,但我發現風格有點長):

?Michael Nielsen著作的《神經網路與深度學習》

其他材料

有很多深度學習的應用(不僅僅是圖像識別!)。我收集了一些介紹材料來涵蓋其各個方面(請注意:它們有各種困難)。不要嘗試將它們全部閱讀 ——我把它們列為靈感,而不是恐嚇!

?通讀性:

《循環神經網路的不合理有效性》——Andrej Karpathy

《卷積神經網路如何看待世界 》——Keras Blog

《What convolutional neural networks look at when they see nudity》——Clarifai博客(NSFW)

《用於藝術風格遷移的卷積神經網路》——Harish Nrayanan

《夢幻、藥物和康復》——我的幻燈片(NSFW),我正在考慮把它變成一個更長的帖子——基於常識錯誤下的機器學習VS人類學習。

?技術性:

《Yes you should understand backprop》——Andrej Karpathy

《基於Keras的遷移學習》——Prakash Vanapalli

《50行代碼中的生成對抗網路(GAN)》(PyTorch)

《Minimal and Clean Reinforcement Learning Examples》

《梯度下降優化演算法概述》——Sebastian Ruder

《風格遷移的優化選擇》——Slav Ivanov

《在Keras建造自動編碼器》——Francois Chollet

《理解長短期記憶網路模型(LSTM)》——Chris Olah

《RNN&LSTMs》——Rohan Kapur

牛津深度自然語言處理2017課程

?資源清單

《如何開始學習深度學習》——Ofir Press

《深度學習指南》——YN ^ 2

?最流行的:

r / MachineLearning Reddit頻道涵蓋大部分最新內容

distill.pub—一種用於機器學習研究的互動式、視覺的、開放的期刊,並附有說明文章

我的鏈接在pinboard.in/u:pmigdal/t:deep-learning——雖然只能保存,而不是自動推薦

@fastml_extra Twitter頻道

GitXiv——提供論文及代碼

不要害怕閱讀學術論文。有些文章寫得很好,有著深刻的見解(如果你有Kindle或其他電子書閱讀器,我推薦Dontprint)。

?數據(通常是具有挑戰性的)

Kaggle

從單次導聯心電圖記錄中的AF分類: 2017年心理學挑戰中的PhysioNet /計算

2017 iNaturalist競賽(675k圖像和5k物種),vide Mushroom AI

希望這篇文章可以使你對深度學習有一個更為深入的了解。

來源:Piotr Migda? - blog

作者:Piotr Migda?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

英特爾以技術創新+生態合作 擁抱AI時代
60年了,LISP語言的進化史是否會引發你對AI未來的新思考
鄧志東:人工智慧將助力自動駕駛產業落地
工業領域首家AI企業天准 與近200家企業共推中國AI進程
如何使用SparkNet進行分布式深度神經網路訓練

TAG:機器人圈 |

您可能感興趣

Python 機器學習 Scikit-learn 完全入門指南
Electrical Engineering Master 選課指南
簡版科幻入坑指南/Instruction of Falling for SF-Abridged Edition
狗狗飲水指南 How Much Water Should Your Dog Be Drinking?
I left my heart in San Francisco 舊金山旅行指南
白色版Virgil Abloh x Nike VaporMax發售之際,雙手奉上Fake Or Real辨別指南!
IOS 11 Human Interface Guidelines-視覺設計指南
Dream Fitness健身指南
21世紀孤獨生活指南×Kovanen&Vivian Maier&Amélie
收藏者指南:Van Cleef&Arpels
spring 5 webclient使用指南
Mozilla發布Firefox Reality WebVR開發者指南
Python Matplotlib 繪圖使用指南
土著指南-Venice Beach,LA
Apache Shiro 的Web應用支持指南
舊裝勞力士簡易中文買家指南 Part1.9 Service Case&Fake Case
職場指南之三:Working with a bully boss
周三鑒定科|Chanel Costume Jewelry鑒定指南
英式傳統下午茶指南‖Food and Tea Service
中國Sneakerhead歧視指南