MXnet的學習筆記,這次主要是MXnet提供的example的綜述介紹。關于MXnet在OSX下的編譯安裝,可以看這里Mac下編譯安裝MXNet!!!
簡介
MXnet的樣例程序分為5個部分,分別是
- Deep Learning Examples 包括各種深度學習應用與比賽的實例
- Languages Binding Examples 包括各種MXnet已支持或開發中的多語言實現樣例(C++/ R/ Julia/ Go/ JNI/ JavaScript 等,以及為移動端開發而設計的Amalgamation代碼整合工具)
- 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.
- Mobile App Examples 各種移動平臺(iOS/ Android)上如何使用MXnet的示例
- Web Predictive Services 使用MXnet搭建的Web Service實例
- Others 其他的東西
下面主要介紹一下第一部分Deep Learning Examples里的例子,以及第六部分“其他的東西”。
Deep Learning Examples
基本上按照應用的網絡結構來區分,可以把MXnet中深度學習的示例分為三大類,基于CNN、RNN、以及自動編碼機(Auto Encoder)的神經網絡。
一、基于CNN的樣例
1. Image classification 圖像分類
實現了在MNIST、CIFAR、ImageNet-1k、ImageNet-Full 等數據集上的圖像識別,實現了基于多GPU的訓練以及分布式訓練。 [./mxnet/example/image-classification]
實現的網絡結構包括
-
多層感知機 MLP (1986) [./train_mnist.py]
一種前向結構的人工神經網絡,將一組輸入向量映射到一組輸出向量,由多個節點層所組成,每一層都全連接到下一層。除了輸入節點,每個節點都是一個帶有非線性激活函數的神經元(或稱處理單元)。使用 反向傳播算法 Backpropagation 進行訓練。
克服了感知機不能對線性不可分數據進行識別的弱點。 -
LeNet (1998) [./train_mnist.py]
由現任紐約大學教授、Facebook AI Research 主任 Yann LeCun 在1989年提出原型,是第一個將 反向傳播算法 Backpropagation 訓練的CNN用在手寫數字識別上的網絡。經過幾次修改在1998年發表的論文中提出了LeNet-5。 -
AlexNet (2012) [./symbol_alexnet.py]
2012年ILSVRC- ImageNet Large Scale Visual Recognition Challenge比賽冠軍的模型(以第一作者Alex Krizhevsky命名)。是Geoffrey E. Hinton(深度學習三巨頭之一)與其學生Alex為了回應別人對于深度學習的質疑而將深度學習用于ImageNet(目前最大的帶標簽的圖像數據集)上,其結果相對state-of-the-art提高顯著(top-1 錯誤率由45.7%降到35.7%,top-5 錯誤率由25%降低為17%)。它證明了CNN在復雜模型下的有效性,使用GPU實現使得訓練在可接受的時間范圍內得到結果。極大的推動了CNN在計算機視覺等多個領域的發展。 -
GoogLeNet (2014) [./symbol_googlenet.py]
ILSVRC2014中,Object detection (DET) 以及 Object localization (LOC) 在Classification上的冠軍。其證明了用更多的卷積,更深的層次可以得到更好的結構,可以直觀的感受一下:
GoogLeNet的網絡結構 -
VGG (2014) [./symbol_vgg.py]
ILSVRC2014中,Object localization (LOC) 在 Localization 上的冠軍。Oxford Visual Geometry Group (縮寫為VGG)在文章 Very deep convolutional networks for large-scale image recognition 中描述的網絡。它繼承了LeNet以及AlexNet的一些框架,尤其是跟AlexNet框架非常像,VGG也是5個group的卷積、2層Full Connect圖像特征、1層Full Connect分類特征,可以看做和AlexNet一樣總共8個部分。 - **Inception with Batch Normalisation (2015) **
Inception with Batch Normalisation 網絡根據輸入圖像大小和數量的不同,對隱含層的參數做了微調(卷積層的卷積核數量、全連接層的最后輸出類別數量等等)。- 輸入圖像大小在28 x 28像素左右適用 [./symbol_inception-bn-28-small.py]
- 輸入圖像大小在224 x 224像素左右適用 [./symbol_inception-bn.py]
- 輸入圖像大小在299 x 299像素左右適用 *[./symbol_inception-v3.py] *
- 輸入為整個ImageNet數據集時適用 *[./symbol_inception-bn-full.py] *
-
ResNet (2015) [./symbol_resnet-28-small.py] [./symbol_resnet.py]
ILSVRC2015中,Object detection (DET) 和 Object localization (LOC) 的雙料冠軍。由微軟亞洲研究院MSRA的何愷明及其團隊提出,最深的模型達到了152層。其特殊之處在于設計了“bottleneck”形式的block(有跨越幾層的直連),即所謂的Residual function。
Residual function
LeNet和MLP的網絡結構都定義在train_mnist.py中,其他網絡的結構都定義在對應的symbol_*net.py里。
對于不同的訓練數據集,MXnet提供了不同的訓練接口 train_mnist.py 、train_cifar10.py、train_imagenet.py 。
根據提供的參數不同,train_*.py可以支持多種訓練和結果輸出方式,除了神經網絡訓練中常見的設定迭代次數、batch-size、學習率、動態學習率的因子和迭代次數、以及指定訓練集和測試集的相關參數外,還支持:
- 設定--model-prefix 和 --save-model-prefix 參數,可以輸出每次迭代之后網絡的參數結果到指定目錄中,再次訓練時設定 --load-epoch 參數可以從指定迭代次數的參數結果繼續訓練。
- 設定使用GPU訓練時的GPU使用個數 --gpus。
- 設定MXnet內部實現機制的相關參數,如--kv-store等等。
2. Image Segmentation 圖像分割
基于VGG16網絡,使用FCN(Fully Conventional Network)模型進行圖像分割,可以選擇自己訓練或者下載預訓練過的模型直接進行圖像分割。[~/mxnet/example/fcn-xs]
3. Image Identification 圖像識別
- 第一屆Kaggle National Data Science Bowl比賽,要求搭建一個圖像識別系統來處理由水下圖像傳感器收集的微觀高像素照片,以分析海水中浮游生物的種類和數量。
MxNet的例子實現時調用了Image Classification中的 find_mxnet.py 和 train_model.py 進行訓練,網絡結構定義在 symbol_dsb.py 中。
[~/mxnet/example/kaggle-ndsb1] - 第二年的Kaggle Second Annual Data Science Bowl比賽,要求搭建一個系統,通過處理超過1000個患者的心臟核磁共振成像(MRI)來估計患者的舒張壓和收縮壓,以此來幫助診斷心臟病。
網絡結構使用了LeNet,并使用了batch normalization和dropout技術。例子搭建的網絡需要使用GPU來進行訓練。
[~/mxnet/example/kaggle-ndsb2]
4. Image Artistic Style 圖像藝術風格
來自文章A Neural Algorithm of Artistic Style,搭建了一個基于深度神經網絡來分解圖像的內容和風格,并把提取出的風格和其他的內容結合起來,生成新的圖像。就像這樣子
網絡結構選擇的是VGG19,更詳細一點的介紹可以看這里:[MXnet] Neural Art。
[~/mxnet/example/neural-style]
5. Text Classification 文本分類
來自文章Convolutional Neural Networks for Sentence Classification,MXnet例子中實現的做了簡化(具體怎么簡化還沒有細看)。
實現的時候基于這篇博客,網絡結構 looks roughly as follows
[~/mxnet/example/cnn_text_classification]

6. Adversarial Example Generation 對抗樣本生成
在MXnet上實現了使用fast sign method生成對抗樣本(Adversarial Example):即在數據集中通過故意添加細微的干擾所形成的輸入樣本,受干擾之后的輸入導致模型以高置信度給出一個錯誤的輸出。更詳細的例子可以看這里:如何讓神經網絡把熊貓識別為禿鷲。 [~/mxnet/example/adversary]
7. Image Generation 圖像生成
基于文章Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks,將CNN用于非監督學習進行圖像生成。
GAN 包含一對模型——一個生成模型(G)和一個判別模型(D)。用一個很經典的比喻就是,生成模型(G)就像小偷,要盡可能地提高自己的偷竊手段去欺騙身為警察的判別模型(D),而D也要盡可能地訓練自己的火眼金睛去防止被欺騙。所以,真正的學習過程就變成了一種生成模型(G)和判別模型(D)之間的競爭過程——隨機從真實樣本和由生成模型(G)生成出的“假樣本”中取一個,讓判別模型(D)去判斷是否為真。
GAN 這種競爭的方式不再要求一個假設的數據分布,而是直接進行 sampling,從而真正達到了理論上可以完全逼近真實數據。這也是 GAN 最大的優勢。
可以直觀的感受一下DCGAN生成的圖像:
還是挺像真實的臥室的~
8. Bayesian Methods 貝葉斯方法
使用優化的貝葉斯方法來進行深度網絡訓練,以降低網絡過擬合的問題。
[~/mxnet/example/bayesian-methods]
- 實現了Stochastic Gradient Langevin Dynamics (SGLD)算法。 [./sgld.ipynb]
- 實現了DistilledSGLD算法。 [./bdk.ipynb]
二、基于RNN的樣例
1. Natural Language Processing 自然語言處理
使用了MXnet底層的Symbol接口實現的RNN例子。 [~/mxnet/example/rnn]
- 搭建了LSTM網絡結構 [./lstm.py]
- 使用LSTM網絡實現了PennTreeBank語言處理模型,在NLP中用來對語料進行標注,標注內容包括詞性標注以及句法分析。 [./lstm_bucketing.py]
- 使用 lstm.py 訓練character-level LSTM網絡的介紹。[./char-rnn.ipynb]
2. Array Sorting 數組排序
使用Bidirection LSTM進行數組排序。
[~/mxnet/example/bi-lstm-sort]
3. Speech Recognition 語音識別
使用LSTM進行語音識別,借助Kaldi Speech Recognition Toolkit進行預處理,網絡結構定義在 lstm_proj.py 中。
[~/mxnet/example/speech-demo]
三、基于自動編碼機Auto Encoder的樣例
在MXnet上實現了自動編碼機(Auto Encoder)網絡,使用了MNIST數據集進行測試。 [~/mxnet/example/audoencoder] [~/mxnet/example/dec]
Others 其他東西
在MXnet的例子中,還有幾個沒有被囊括進來的:
- 教你如何使用MXnet進行multi-label task學習。 [~/mxnet/example/multi-task]
- 用python基于MXnet進行開發的簡單教程,包括 Configuring Net to get Multiple Outputs 和 Configuring Image Record Iterator。
[~/mxnet/example/python-howto] - 用于顯示MXnet不同內存分配機制(inplace/ co-share/ both)下的內存消耗。實現的例子基于**Inception with Batch Normalisation **網絡。
[~/mxnet/example/memcost] - 使用MXnet的NDArray調用Torch的tensor mathematical functions,以及在MXnet中搭建Torch的訓練模型。 [~/mxnet/example/torch]
- 使用NDarray/ bumpy實現的softmax層,體現numpy快速定義新operator的例子,以對性能要求不高的Symbol進行快速實現和測試。 [~/mxnet/example/numpy-ops]
一點感受
因為對CNN的了解比較多一點,主要是看了一下基于CNN的例子的代碼。
感覺上用MXnet定義神經網絡結構確實比較方便友好,比如Image Classification中的例子,用不同的網絡對同一個數據集進行訓練,只需要簡單的通過調用MXnet內置的高階Symbol API,指定卷積層、非線性轉化(激活)層、池化(下采樣)層、全連接層、Softmax層等等的參數和連接方式,由于MXnet已經預先把每一層用Symbol的方式生成了計算圖,只要在使用時指定參數即可。
基于CNN的網絡的訓練過程基本上類似,都通過調用 train_model.py ,把設定好的網絡結構、網絡參數、訓練數據集、測試數據集等等傳到統一的接口進行訓練。
可能使用MXnet實現基于CNN的不同應用最大的區別就在于網絡結構、參數的指定,以及數據集的處理(通過 train_*.py 中的 get_iterator 方法,與參數服務器Parameter Server相關)。
由于現在還是起步階段,對于基于RNN和Auto Encoder的例子實現還沒有做更深入的分析,對于MXnet內部Symbol和KVstore的實現機制也只是粗略的了解,在之后的研究學習中將做進一步探究。