资源 | DMLC团队发布GluonCV和GluonNLP:两种简单易用的DL工具箱

选自

 Gluon

机器之心编译

参与:思源、李亚洲

近日,DMLC 发布了简单易用的深度学习工具箱 GluonCV 和 GluonNLP,它们分别为计算机视觉和自然语言处理提供了顶级的算法实现与基本运算。本文简要介绍了这两个工具箱,并提供了基本的使用示例,更多详细的内容请查看它们的原文档。

  • GluonCV 文档地址:http://gluon-cv.mxnet.io 

  • GluonNLP 文档地址:http://gluon-nlp.mxnet.io/

  • 自去年以来,MXNet 的动态图接口 Gluon 凭借着它的简单易用、并行效率高和节省显存等特点,成为了非常受欢迎的一个开源工具。此外,Gluon 最大的特点就是文档和教程齐全,李沐及 MXNet 团队还发布了一系列「动手学深度学习」的公开课。

    GluonCV 和 GluonNLP 继承了 Gluon 的优良传统,它们都能使用简单易用的 API 构建复杂的深度神经网络。此外,这两个项目目前都处于开发的早期阶段,它们的更新频率会比较高。因此,各位读者对该项目的贡献将极大地完善用户体验和工具性能。

  • GluonCV 项目地址:http://github.com/dmlc/gluon-cv

  • GluonNLP 项目地址:http://github.com/dmlc/gluon-nlp

  • GluonCV 提供了计算机视觉领域顶级深度学习算法的实现。设计上,GluonCV 是为了帮助工程师、研究人员、学生快速的做出产品原型、验证新思路、学习计算机视觉。

    1. 训练脚本从而重现最新论文中的顶级结果;

    2. 大量的预训练模型;

    3. 细心设计的 API,便于理解实现;

    4. 社区支持。

    GluonNLP 提供了 NLP 领域顶级深度学习模型的实现,且建立了文本数据管道和模型的模块。设计上,它同样也是为了让工程师、研究员和学生能快速的实现研究思路,做出产品原型。该工具箱提供以下四大特征:

    1. 训练脚本来重现研究论文中的顶级结果;

    2. 通用 NLP 任务的预训练模型;

    3. 仔细设计的 API,极大的减少了实现的复杂性;

    4. 社区支持。

    安装

    安装 MXNET

    GluonCV 和 GluonNLP 都依赖最新版的 MXNet,最简单的方式是通过 pip 安装 MXNet,运行下面的命令行将安装 CPU 版本的 MXNet。

    pip install --pre --upgrade mxnet

    安装 GluonCV

    使用 pip 是安装 GluonCV 最简单的方式:

    pip install gluoncv

    当然,我们也可以使用 Git 复制 GluonCV 项目并在本地安装:

    git

    clone

    http://github.com/dmlc/gluon-cvcd gluon-cv && python setup.py install --user

    安装 GluonNLP

    同样,通过以下 pip 命令安装 GluonNLP 也是最简单的:

    pip install gluonnlp



    这两个工具目前都提供了案例或教程,但 GluonNLP 假定了用户对深度学习与 NLP 有基础理解,GluonCV 的教程假定用户对深度学习与计算机视觉有基础了解。以下简要展示了这两个工具的使用案例。



    以下的案例将使用 20 层的残差网络在 CIFAR10 上从头开始训练,我们这里只展示了模型架构和最优化方法。使用 GluonCV 首先需要导入这个库:

    import

    numpy

    as

    np

    import

    mxnet

    as

    mx



    from

    mxnet

    import

    gluon, nd

    from

    mxnet

    import

    autograd

    as

    ag

    from

    mxnet.gluon

    import

    nn



    from

    gluoncv.model_zoo

    import

    get_model

    选择模型架构可以简单地从已有模型中导入,以下将从 GluonCV 的模型库中导入用于 CIFAR10 的 20 层残差网络:



    # number of GPUs to use



    num_gpus =

    1



    ctx = [mx.gpu(i)

    for

    i

    in

    range(num_gpus)]



    # Get the model CIFAR_ResNet20_v1, with 10 output classes, without pre-trained weights



    net = get_model(

    "cifar_resnet20_v1"

    , classes=

    10

    )

    net.initialize(mx.init.Xavier(), ctx = ctx)



    而剩下的优化方法及损失函数的配置就可以通过一般的 Gluon 接口完成,这同样也是非常简明和高效的使用方法。



    # Learning rate decay factor



    lr_decay =

    0.1



    # Epochs where learning rate decays



    lr_decay_epoch = [

    80

    ,

    160

    , np.inf]



    # Nesterov accelerated gradient descent



    optimizer =

    "nag"



    # Set parameters



    optimizer_params = {

    "learning_rate"

    :

    0.1

    ,

    "wd"

    :

    0.0001

    ,

    "momentum"

    :

    0.9

    }



    # Define our trainer for net



    trainer = gluon.Trainer(net.collect_params(), optimizer, optimizer_params)



    loss_fn = gluon.loss.SoftmaxCrossEntropyLoss()

    对于 GluonNLP 来说,一般的任务都可以分为加载数据、构建词表、搭建模型和加载词嵌入等。以下将针对这些步骤展示该自然语言处理库的简单使用过程。

    首先,以下代码将导入 GluonNLP,并加载 Wikitext-2 数据集:

    >>>

    import

    gluonnlp

    as

    nlp

    >>>

    train = nlp.data.WikiText2(segment=

    "train"

    )

    >>>

    train[

    0

    ][

    0

    :

    5

    ]

    [

    "="

    ,

    "Valkyria"

    ,

    "Chronicles"

    ,

    "III"

    ,

    "="

    ]



    随后,我们可以根据上面导入的数据集创建词表:

    >>>

    vocab = nlp.Vocab(counter=nlp.data.Counter(train[

    0

    ]))

    >>>

    vocab

    Vocab(size=

    33280

    , unk=

    "<unk>"

    , reserved=

    "["<pad>", "<bos>", "<eos>"]"

    )



    创建词表后,我们就能继续构建神经网络模型。如下将从模型仓库中导入一个标准的 RNN 语言模型,并将其应用到上面加载的数据集上:

    >>>

    model = nlp.model.language_model.StandardRNN(

    "lstm"

    , len(vocab),

    ...

                                               

    200

    ,

    200

    ,

    2

    ,

    0.5

    ,

    True

    )

    >>>

    model

    StandardRNN(

     (embedding): HybridSequential(

       (

    0

    ): Embedding(

    33280

    ->

    200

    , float32)

       (

    1

    ): Dropout(p =

    0.5

    , axes=())

     )

     (encoder): LSTM(

    200

    ->

    200.0

    , TNC, num_layers=

    2

    , dropout=

    0.5

    )

     (decoder): HybridSequential(

       (

    0

    ): Dense(

    200

    ->

    33280

    , linear)

     )

    )

    最后,加载词嵌入表征就能馈送到模型并进行训练。如下将加载 GloVe 词嵌入表征,它是一种顶级的英语词嵌入方法:

    >>>

    glove = nlp.embedding.create(

    "glove"

    , source=

    "glove.6B.50d"

    )

    # Obtain vectors for "baby" in the GloVe word embedding



    >>>

    type(glove[

    "baby"

    ])

    <

    class

    "

    mxnet

    .

    ndarray

    .

    ndarray

    .

    NDArray

    ">

    >>>

    glove

    ["

    baby

    "].

    shape



    (

    50

    ,)





    本文为机器之心编译,

    转载请联系本公众号获得授权



    ?------------------------------------------------

    加入机器之心(全职记者 / 实习生):hr@jiqizhixin.com

    投稿或寻求报道:editor@jiqizhixin.com

    广告 & 商务合作:bd@jiqizhixin.com