[MXnet] Simple Introduction to the Example

MXnet的學(xué)習(xí)筆記,這次主要是MXnet提供的example的綜述介紹。關(guān)于MXnet在OSX下的編譯安裝,可以看這里Mac下編譯安裝MXNet?。?!

簡(jiǎn)介


MXnet的樣例程序分為5個(gè)部分,分別是

  1. Deep Learning Examples 包括各種深度學(xué)習(xí)應(yīng)用與比賽的實(shí)例
  2. Languages Binding Examples 包括各種MXnet已支持或開發(fā)中的多語言實(shí)現(xiàn)樣例(C++/ R/ Julia/ Go/ JNI/ JavaScript 等,以及為移動(dòng)端開發(fā)而設(shè)計(jì)的Amalgamation代碼整合工具)
  3. IPython Notebooks MXnet的一些基本教程,基于IPython的Notebook格式,要想在OSX上配置IPython及使用Notebook的步驟見這里

IPython is an awesome tool that allows you to combine Python codes with rich text to create meaningful & interactive contents.

  1. Mobile App Examples 各種移動(dòng)平臺(tái)(iOS/ Android)上如何使用MXnet的示例
  2. Web Predictive Services 使用MXnet搭建的Web Service實(shí)例
  3. Others 其他的東西

下面主要介紹一下第一部分Deep Learning Examples里的例子,以及第六部分“其他的東西”。

Deep Learning Examples


基本上按照應(yīng)用的網(wǎng)絡(luò)結(jié)構(gòu)來區(qū)分,可以把MXnet中深度學(xué)習(xí)的示例分為三大類,基于CNN、RNN、以及自動(dòng)編碼機(jī)(Auto Encoder)的神經(jīng)網(wǎng)絡(luò)。

一、基于CNN的樣例

1. Image classification 圖像分類

實(shí)現(xiàn)了在MNIST、CIFAR、ImageNet-1k、ImageNet-Full 等數(shù)據(jù)集上的圖像識(shí)別,實(shí)現(xiàn)了基于多GPU的訓(xùn)練以及分布式訓(xùn)練。 [./mxnet/example/image-classification]
實(shí)現(xiàn)的網(wǎng)絡(luò)結(jié)構(gòu)包括

  • 多層感知機(jī) MLP (1986) [./train_mnist.py]
    一種前向結(jié)構(gòu)的人工神經(jīng)網(wǎng)絡(luò),將一組輸入向量映射到一組輸出向量,由多個(gè)節(jié)點(diǎn)層所組成,每一層都全連接到下一層。除了輸入節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都是一個(gè)帶有非線性激活函數(shù)的神經(jīng)元(或稱處理單元)。使用 反向傳播算法 Backpropagation 進(jìn)行訓(xùn)練。
    克服了感知機(jī)不能對(duì)線性不可分?jǐn)?shù)據(jù)進(jìn)行識(shí)別的弱點(diǎn)。
  • LeNet (1998) [./train_mnist.py]
    由現(xiàn)任紐約大學(xué)教授、Facebook AI Research 主任 Yann LeCun 在1989年提出原型,是第一個(gè)將 反向傳播算法 Backpropagation 訓(xùn)練的CNN用在手寫數(shù)字識(shí)別上的網(wǎng)絡(luò)。經(jīng)過幾次修改在1998年發(fā)表的論文中提出了LeNet-5。
  • AlexNet (2012) [./symbol_alexnet.py]
    2012年ILSVRC- ImageNet Large Scale Visual Recognition Challenge比賽冠軍的模型(以第一作者Alex Krizhevsky命名)。是Geoffrey E. Hinton(深度學(xué)習(xí)三巨頭之一)與其學(xué)生Alex為了回應(yīng)別人對(duì)于深度學(xué)習(xí)的質(zhì)疑而將深度學(xué)習(xí)用于ImageNet(目前最大的帶標(biāo)簽的圖像數(shù)據(jù)集)上,其結(jié)果相對(duì)state-of-the-art提高顯著(top-1 錯(cuò)誤率由45.7%降到35.7%,top-5 錯(cuò)誤率由25%降低為17%)。它證明了CNN在復(fù)雜模型下的有效性,使用GPU實(shí)現(xiàn)使得訓(xùn)練在可接受的時(shí)間范圍內(nèi)得到結(jié)果。極大的推動(dòng)了CNN在計(jì)算機(jī)視覺等多個(gè)領(lǐng)域的發(fā)展。
  • GoogLeNet (2014) [./symbol_googlenet.py]
    ILSVRC2014中,Object detection (DET) 以及 Object localization (LOC) 在Classification上的冠軍。其證明了用更多的卷積,更深的層次可以得到更好的結(jié)構(gòu),可以直觀的感受一下:
    GoogLeNet的網(wǎng)絡(luò)結(jié)構(gòu)
  • VGG (2014) [./symbol_vgg.py]
    ILSVRC2014中,Object localization (LOC) 在 Localization 上的冠軍。Oxford Visual Geometry Group (縮寫為VGG)在文章 Very deep convolutional networks for large-scale image recognition 中描述的網(wǎng)絡(luò)。它繼承了LeNet以及AlexNet的一些框架,尤其是跟AlexNet框架非常像,VGG也是5個(gè)group的卷積、2層Full Connect圖像特征、1層Full Connect分類特征,可以看做和AlexNet一樣總共8個(gè)部分。
  • **Inception with Batch Normalisation (2015) **
    Inception with Batch Normalisation 網(wǎng)絡(luò)根據(jù)輸入圖像大小和數(shù)量的不同,對(duì)隱含層的參數(shù)做了微調(diào)(卷積層的卷積核數(shù)量、全連接層的最后輸出類別數(shù)量等等)。
    • 輸入圖像大小在28 x 28像素左右適用 [./symbol_inception-bn-28-small.py]
    • 輸入圖像大小在224 x 224像素左右適用 [./symbol_inception-bn.py]
    • 輸入圖像大小在299 x 299像素左右適用 *[./symbol_inception-v3.py] *
    • 輸入為整個(gè)ImageNet數(shù)據(jù)集時(shí)適用 *[./symbol_inception-bn-full.py] *
  • ResNet (2015) [./symbol_resnet-28-small.py] [./symbol_resnet.py]
    ILSVRC2015中,Object detection (DET)Object localization (LOC) 的雙料冠軍。由微軟亞洲研究院MSRA的何愷明及其團(tuán)隊(duì)提出,最深的模型達(dá)到了152層。其特殊之處在于設(shè)計(jì)了“bottleneck”形式的block(有跨越幾層的直連),即所謂的Residual function。
    Residual function

LeNet和MLP的網(wǎng)絡(luò)結(jié)構(gòu)都定義在train_mnist.py中,其他網(wǎng)絡(luò)的結(jié)構(gòu)都定義在對(duì)應(yīng)的symbol_*net.py里。
對(duì)于不同的訓(xùn)練數(shù)據(jù)集,MXnet提供了不同的訓(xùn)練接口 train_mnist.py 、train_cifar10.py、train_imagenet.py 。
根據(jù)提供的參數(shù)不同,train_*.py可以支持多種訓(xùn)練和結(jié)果輸出方式,除了神經(jīng)網(wǎng)絡(luò)訓(xùn)練中常見的設(shè)定迭代次數(shù)、batch-size、學(xué)習(xí)率、動(dòng)態(tài)學(xué)習(xí)率的因子和迭代次數(shù)、以及指定訓(xùn)練集和測(cè)試集的相關(guān)參數(shù)外,還支持:

  • 設(shè)定--model-prefix 和 --save-model-prefix 參數(shù),可以輸出每次迭代之后網(wǎng)絡(luò)的參數(shù)結(jié)果到指定目錄中,再次訓(xùn)練時(shí)設(shè)定 --load-epoch 參數(shù)可以從指定迭代次數(shù)的參數(shù)結(jié)果繼續(xù)訓(xùn)練。
  • 設(shè)定使用GPU訓(xùn)練時(shí)的GPU使用個(gè)數(shù) --gpus。
  • 設(shè)定MXnet內(nèi)部實(shí)現(xiàn)機(jī)制的相關(guān)參數(shù),如--kv-store等等。

2. Image Segmentation 圖像分割

基于VGG16網(wǎng)絡(luò),使用FCN(Fully Conventional Network)模型進(jìn)行圖像分割,可以選擇自己訓(xùn)練或者下載預(yù)訓(xùn)練過的模型直接進(jìn)行圖像分割。[~/mxnet/example/fcn-xs]

3. Image Identification 圖像識(shí)別

  • 第一屆Kaggle National Data Science Bowl比賽,要求搭建一個(gè)圖像識(shí)別系統(tǒng)來處理由水下圖像傳感器收集的微觀高像素照片,以分析海水中浮游生物的種類和數(shù)量。
    MxNet的例子實(shí)現(xiàn)時(shí)調(diào)用了Image Classification中的 find_mxnet.pytrain_model.py 進(jìn)行訓(xùn)練,網(wǎng)絡(luò)結(jié)構(gòu)定義在 symbol_dsb.py 中。
    [~/mxnet/example/kaggle-ndsb1]
  • 第二年的Kaggle Second Annual Data Science Bowl比賽,要求搭建一個(gè)系統(tǒng),通過處理超過1000個(gè)患者的心臟核磁共振成像(MRI)來估計(jì)患者的舒張壓和收縮壓,以此來幫助診斷心臟病。
    網(wǎng)絡(luò)結(jié)構(gòu)使用了LeNet,并使用了batch normalizationdropout技術(shù)。例子搭建的網(wǎng)絡(luò)需要使用GPU來進(jìn)行訓(xùn)練。
    [~/mxnet/example/kaggle-ndsb2]

4. Image Artistic Style 圖像藝術(shù)風(fēng)格

來自文章A Neural Algorithm of Artistic Style,搭建了一個(gè)基于深度神經(jīng)網(wǎng)絡(luò)來分解圖像的內(nèi)容風(fēng)格,并把提取出的風(fēng)格和其他的內(nèi)容結(jié)合起來,生成新的圖像。就像這樣子

輸入:梵高的“星夜”風(fēng)格和一張風(fēng)景圖片

輸出:“星夜”風(fēng)的風(fēng)景圖

網(wǎng)絡(luò)結(jié)構(gòu)選擇的是VGG19,更詳細(xì)一點(diǎn)的介紹可以看這里:[MXnet] Neural Art。
[~/mxnet/example/neural-style]

5. Text Classification 文本分類

來自文章Convolutional Neural Networks for Sentence Classification,MXnet例子中實(shí)現(xiàn)的做了簡(jiǎn)化(具體怎么簡(jiǎn)化還沒有細(xì)看)。
實(shí)現(xiàn)的時(shí)候基于這篇博客,網(wǎng)絡(luò)結(jié)構(gòu) looks roughly as follows
[~/mxnet/example/cnn_text_classification]

CNN for text classification
CNN for text classification

6. Adversarial Example Generation 對(duì)抗樣本生成

在MXnet上實(shí)現(xiàn)了使用fast sign method生成對(duì)抗樣本(Adversarial Example):即在數(shù)據(jù)集中通過故意添加細(xì)微的干擾所形成的輸入樣本,受干擾之后的輸入導(dǎo)致模型以高置信度給出一個(gè)錯(cuò)誤的輸出。更詳細(xì)的例子可以看這里:如何讓神經(jīng)網(wǎng)絡(luò)把熊貓識(shí)別為禿鷲。 [~/mxnet/example/adversary]

7. Image Generation 圖像生成

基于文章Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks,將CNN用于非監(jiān)督學(xué)習(xí)進(jìn)行圖像生成。

GAN 包含一對(duì)模型——一個(gè)生成模型(G)和一個(gè)判別模型(D)。用一個(gè)很經(jīng)典的比喻就是,生成模型(G)就像小偷,要盡可能地提高自己的偷竊手段去欺騙身為警察的判別模型(D),而D也要盡可能地訓(xùn)練自己的火眼金睛去防止被欺騙。所以,真正的學(xué)習(xí)過程就變成了一種生成模型(G)和判別模型(D)之間的競(jìng)爭(zhēng)過程——隨機(jī)從真實(shí)樣本和由生成模型(G)生成出的“假樣本”中取一個(gè),讓判別模型(D)去判斷是否為真。
GAN 這種競(jìng)爭(zhēng)的方式不再要求一個(gè)假設(shè)的數(shù)據(jù)分布,而是直接進(jìn)行 sampling,從而真正達(dá)到了理論上可以完全逼近真實(shí)數(shù)據(jù)。這也是 GAN 最大的優(yōu)勢(shì)。

可以直觀的感受一下DCGAN生成的圖像:

Bedrooms after 5 epochs

還是挺像真實(shí)的臥室的~

8. Bayesian Methods 貝葉斯方法

使用優(yōu)化的貝葉斯方法來進(jìn)行深度網(wǎng)絡(luò)訓(xùn)練,以降低網(wǎng)絡(luò)過擬合的問題。
[~/mxnet/example/bayesian-methods]

二、基于RNN的樣例

1. Natural Language Processing 自然語言處理

使用了MXnet底層的Symbol接口實(shí)現(xiàn)的RNN例子。 [~/mxnet/example/rnn]

  • 搭建了LSTM網(wǎng)絡(luò)結(jié)構(gòu) [./lstm.py]
  • 使用LSTM網(wǎng)絡(luò)實(shí)現(xiàn)了PennTreeBank語言處理模型,在NLP中用來對(duì)語料進(jìn)行標(biāo)注,標(biāo)注內(nèi)容包括詞性標(biāo)注以及句法分析。 [./lstm_bucketing.py]
  • 使用 lstm.py 訓(xùn)練character-level LSTM網(wǎng)絡(luò)的介紹。[./char-rnn.ipynb]

2. Array Sorting 數(shù)組排序

使用Bidirection LSTM進(jìn)行數(shù)組排序。
[~/mxnet/example/bi-lstm-sort]

3. Speech Recognition 語音識(shí)別

使用LSTM進(jìn)行語音識(shí)別,借助Kaldi Speech Recognition Toolkit進(jìn)行預(yù)處理,網(wǎng)絡(luò)結(jié)構(gòu)定義在 lstm_proj.py 中。
[~/mxnet/example/speech-demo]

三、基于自動(dòng)編碼機(jī)Auto Encoder的樣例

在MXnet上實(shí)現(xiàn)了自動(dòng)編碼機(jī)(Auto Encoder)網(wǎng)絡(luò),使用了MNIST數(shù)據(jù)集進(jìn)行測(cè)試。 [~/mxnet/example/audoencoder] [~/mxnet/example/dec]

Others 其他東西


在MXnet的例子中,還有幾個(gè)沒有被囊括進(jìn)來的:

  • 教你如何使用MXnet進(jìn)行multi-label task學(xué)習(xí)。 [~/mxnet/example/multi-task]
  • 用python基于MXnet進(jìn)行開發(fā)的簡(jiǎn)單教程,包括 Configuring Net to get Multiple OutputsConfiguring Image Record Iterator
    [~/mxnet/example/python-howto]
  • 用于顯示MXnet不同內(nèi)存分配機(jī)制(inplace/ co-share/ both)下的內(nèi)存消耗。實(shí)現(xiàn)的例子基于**Inception with Batch Normalisation **網(wǎng)絡(luò)。
    [~/mxnet/example/memcost]
  • 使用MXnet的NDArray調(diào)用Torchtensor mathematical functions,以及在MXnet中搭建Torch的訓(xùn)練模型。 [~/mxnet/example/torch]
  • 使用NDarray/ bumpy實(shí)現(xiàn)的softmax層,體現(xiàn)numpy快速定義新operator的例子,以對(duì)性能要求不高的Symbol進(jìn)行快速實(shí)現(xiàn)和測(cè)試。 [~/mxnet/example/numpy-ops]

一點(diǎn)感受


因?yàn)閷?duì)CNN的了解比較多一點(diǎn),主要是看了一下基于CNN的例子的代碼。
感覺上用MXnet定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)確實(shí)比較方便友好,比如Image Classification中的例子,用不同的網(wǎng)絡(luò)對(duì)同一個(gè)數(shù)據(jù)集進(jìn)行訓(xùn)練,只需要簡(jiǎn)單的通過調(diào)用MXnet內(nèi)置的高階Symbol API,指定卷積層、非線性轉(zhuǎn)化(激活)層、池化(下采樣)層、全連接層、Softmax層等等的參數(shù)和連接方式,由于MXnet已經(jīng)預(yù)先把每一層用Symbol的方式生成了計(jì)算圖,只要在使用時(shí)指定參數(shù)即可。
基于CNN的網(wǎng)絡(luò)的訓(xùn)練過程基本上類似,都通過調(diào)用 train_model.py ,把設(shè)定好的網(wǎng)絡(luò)結(jié)構(gòu)、網(wǎng)絡(luò)參數(shù)、訓(xùn)練數(shù)據(jù)集、測(cè)試數(shù)據(jù)集等等傳到統(tǒng)一的接口進(jìn)行訓(xùn)練。
可能使用MXnet實(shí)現(xiàn)基于CNN的不同應(yīng)用最大的區(qū)別就在于網(wǎng)絡(luò)結(jié)構(gòu)、參數(shù)的指定,以及數(shù)據(jù)集的處理(通過 train_*.py 中的 get_iterator 方法,與參數(shù)服務(wù)器Parameter Server相關(guān))。
由于現(xiàn)在還是起步階段,對(duì)于基于RNN和Auto Encoder的例子實(shí)現(xiàn)還沒有做更深入的分析,對(duì)于MXnet內(nèi)部Symbol和KVstore的實(shí)現(xiàn)機(jī)制也只是粗略的了解,在之后的研究學(xué)習(xí)中將做進(jìn)一步探究。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容