首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

人工智能的轮子Gluon

程序员的快乐在于能够造出一个人人都能用的轮子,在自己造不出轮子之前,我们先学习下别人家的轮子。

上一次我们简要介绍了MXNet这个工具(原文),相比其它深度学习框架,MXNet具有极佳的性能。这次的重点我们再来说一下最近MXNet在推广的Gluon包。

Gluon好在哪上回说到,MXNet最大的特点是通过命令式编程与申明式编程结合的混合编程,使得MXNet兼具灵活性与非常高的执行性能,这也是MXNet名字的由来(Mixed-Net)。此点主要是通过NDArray和Symbol的结合来实现,对于这两个对象,它们有非常相似的API,通常同一个API连参数顺序都一样,见下图。

所以当想要调适代码,方便地打印数值时就写NDArray。等到模型ok,要上线部署提升性能时,就把之前的代码用Symbol重写一遍。不过,此时还是有点美中不足,就是两次代码一样,只是调用的对象不同(NDArray还是Symbol),却要手动重写代码。聪明的你自然就会想,这个工作很重复(boring)啊。对于程序员来说,重复自己简直不可忍受。那么是否有办法让程序自动的完成这个步骤呢,我设一个开关,需要调试时候点一下,数值刷刷的打印,不想调试关掉它,性能棒棒的。恩,这时Gluon就诞生了,而我们刚才说到的那个开关就是Block里面的hybridize()方法,这是Gluon最大的特点。当然,除此之外,Gluon还采众家所长,从PyTorch、TensorFlow中借鉴了很多优秀的方案,此处先按住不表。

Gluon代码结构

接下来,我们就扒开Gluon的代码,看看它的里子。下图是Gluon 这个包的代码层次。

可以看到,它的核心文件及功能如下:

block.py:网络的基础单元,类比盖房子中所用的砖块

loss.py:不同损失函数的实现

parameter.py: 模型参数的处理

trainer.py:对优化器和参数学习流程的封装

utils.py: 工具包

data: 数据处理包

model_zoo: 方便的加载训练好的预训练模型,降低模型拟合的难度

nn: 预先提供的神经网络层,如卷积,池化操作等都在这里面

rnn: 循环神经网络的操作子

contrib: 其它一些开源社区贡献的尚未很好合入代码的功能

从文件数来看,Gluon代码及其精简,就算把各个文件夹展开,全部文件加在一起也不超过30个,但是却可以提供出非常强大的算法能力。由此可见,有时代码并非越多越好,恰恰相反,代码越少越能体现程序员之功力。

HybridBlock类

说完了代码结构,我们终于走到了关键细节。工(lian)程(dan)师都说构建深度学习算法就像盖(da)房(ji)子(mu),那么这里面最基础的单元一砖一瓦是啥子呢。恩,就HybridBlock无疑了。首先,让我们一起看下与Block相关的类代码关系图:

从图中可见,HybridBlock继承自Block,并且添加了hybrid_forward()方法。请注意,这个方法实际上是一个接口,其中的逻辑留给实际继承它的类自己实现。这样,我们通过继承HybridBlock这个类,就可以很容易的添加自己想要的各种网(sao)络(cao)层(zuo)了。

同时,你可能留意到了hybrid_forward()方法的参数,第一个是F,第二个是x。对于x,自不必说,就是上一层传进来的数据或者symbol占位符。那么F呢,个人的理解,此处的F实际上就是传入的Symbol或者NDArray对象的句柄。这样,hybrid_forward()就可以自动选择是调用哪个对象所对应的API方法了。

总结

最后,推荐一个很好的算(lian)法(dan)学(ru)习(men)地址:https://zh.gluon.ai/,里面有关于深度学习的介绍,并有MXNet动手解决各类机器学习任务的教程,是MXNet官方团队所写,良心之作,干货多多,非常值得细细阅读。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180512G1SM9D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券