基於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歧視指南