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上的冠军。其证明了用更多的卷积,更深的层次可以得到更好的结构,可以直观的感受一下:
-
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。
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的实现机制也只是粗略的了解,在之后的研究学习中将做进一步探究。