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期间静态分配。