0%

Gluon 是 MXNet 实现的一套同时可以支持动态图和静态图的计算接口。和原有的 Symbol 接口相比,Gluon 的封装层次更高,在某种程度上使用更灵活。本文记录在学习Gluon的过程中实现 DeepLab V3 的过程。同时,数据的处理和输入也是使用的 Gluon 中提供的 Dataset 接口。

阅读全文 »

在计算优化中有一个重要的方法是把算法和代码实现解耦, 这样做的好处是, 同一个算法, 可以方便得移植到不同的硬件平台. 同时, 以为算法实现了解耦, 因此, 在代码优化中, 可以非常方便地对硬件有关平台的代码进行灵活的 tune, 从而找到最佳性能方案.

阅读全文 »

Operators 是构建神经网络的必要元素, operators 定义了输入到输出的映射关系. MXNet 有一系列非常丰富的 operators, 有一些是简单的 operators, 例如 element-wise sum, 也有一些复杂的 operators 例如 convolution. 通常情况下, 使用这些 operators 可以构建大部分常见的 nn. 在 MXNet 实现的很多 operators 通常在 numpy 中是有等价形式的, 例如 repreat, tile 等. 那么, 为什么在MXNet中不直接使用 numpy 呢? 其中最重要的原因就是MXNet需要同时支持cpu和gpu运算, 而numpy目前并不支持gpu计算. 另外, 为了最大化 memory 和 runtime efficiency, MXNet 中的大量的 components 做了深度优化, 例如 tensor data structure (NDArray), execution engine, computational graph 等等. MXNet 中实现的 operators 会综合考虑前面的各种优化从而做到性能的极致优化.

阅读全文 »

之前已经有两篇分析了 MXNet 的 Bind 和 SimpleBind 的源码, 这篇, 主要是记录一下 CPP package 中是如何调用 Bind 和 SimpleBind 的. 搞清楚这两部分有两个好处, 一是为自己写代码调用 Bind 提供参考, 二是了解 MXNet 中 Symbol/Graph 和具体的 NDArray 是如何协同的.

阅读全文 »

ResNeXt 和 ResNet, GoogleNet 都是首先构建 building block, 然后把多个 building block 串联起来形成最终的网络结果.这种方法的好处是减少了 hyper-parameters, 而且, 这种方法得到的模型适应性更好, 也就是说不会再 A 数据集上效果很好, 换成 B 数据集效果就很差. ResNeXt 沿用了 ResNet 中 shortcut 的思想, 但是, ResNeXt 在 building block 上做了很大的改进. 针对每一个 building block 在宽度上进行了拓展, 输出的 feature map 的 channel 的数量减少, 进而, 减少了参数的数量.

阅读全文 »

ShuffleNet 主要是对 feature map 的 channel 做 shuffle 操作. 另外, 还借鉴了近期用的比较多的 depthwise separable convolution 的思想. 另外在 alexnet 中因为当时显存不足提出的 group convolution, 随后随着显存的不断增大逐步被弃用的 group convolution 在 ShuffleNet 中配合 shuffle layer 操作大量使用.

阅读全文 »

MobileNet 是 Google 提出的一种 efficient 的模型, 总结来讲, mobilenet 中没有全新的 layer, 因此, 完全可以在现有的框架例如 caffe, mxnet, TensorFlow 中非常方便地实现.

阅读全文 »

Xception 的主要特点是 Depthwise Separable Convolutions, Xception 在多个数据集上并没有比 Inception V3 好很多的结果, 但是, Xception 中 Depthwise Separable Convolutions 的做法在最近的一些高效模型中被广泛使用.

阅读全文 »