MXNet Python Overview Tutorial

MXNet中三个非常重要的概念:

NDArray offers matrix and tensor computations on both CPU and GPU, with automatic parallelization.

Symbol makes defining a neural network extremely easy, and provides automatic differentiation.

KVStore provides data synchronization between multiple GPUs and multiple machines,

NDArray: Numpy风格的张量计算,用于CPU或GPU

在MXNet中,NDArray是矩阵和张量计算的基本运算单元,它和numpy.ndarray很相似,此外还有两个特性:

1、支持多设备:所有的运算都支持多机环境,包括CPU和GPU

2、自动并行:所有的运算都自动进行并行计算

创建和初始化

CPU、GPU都支持创建NDArray,

empty方法详细信息可见mxnet/python/ndarray.py

NDArray的初始化也有多种不同方式:

NDArray和numpy.ndarray之间的转换也很方便:

基本运算

默认情况下,NDArray的运算都是元素之间的计算:

注意,如果两个参与运算的NDArray位于不同的设备上,我们需要先将他们置于同一设备后再进行运算,

读取和保存

方法一使用pickle:

方法二使用NDArray内置save函数保存二进制文件:

c此时是list, 也可以保存成字典:

自动并行

当拥有多个计算设备,NDArray的自动并行化非常有用。

这部分涉及MXNet 的engine模块。

Symbolic 和自动微分

NDArray是MXNet中基本的计算单位,由于和numpy.ndarray很类似,所以上手简单;除此之外,MXNet还提供名为Symbol的符号式接口使得构造神经网络异常简单,不过如果你像我一样以前没接触过符号式编程,这里可能要多花点时间理解。

可以把symbol理解为Caffe中的网络配置,也可以把她理解为Theano中定义的计算图。

symbol 基本计算

下面几行代码创建了一个两层感知机网络:

每一个symbol都有一个唯一的名字,Variable通常用于定义输入或自由变量。

我们也可以自己设定参数名字:

稍复杂计算

MXNet提供很多优化过的symbol操作 (src/operator), 我们也可以定义自己的操作符。

上例中先创建net, 然后像使用函数一样使用net:net2作为输入,得到composed_net。

推断参数的shape

debug时很有用。

Bind the Symbols and Run

前面说过了symbol只是得到计算图,并没有真正计算,而bind函数会创建一个Executor,然后进行真正的计算。

bind实际上将NDArray类型的值赋给symbol,

对于神经网络来说,simple_bind函数比bind更常用,它会自动创建出所有的参数(bind函数必须对参数进行显示赋值),然后直接调用forward(), backward()就可以得到梯度。

所有的内存和计算资源都是在Bind期间静态分配。