数据操作
创建NDArray
NDArray和numpy很像,都是一些基础的数据结构。首先要把环境配好,具体配环境的话就不赘述了。
1、利用arange
函数创建行向量
x = nd.arange(12)
直接看x是这个样子
2、创建各元素为1的张量
nd.ones((3,4))
3、创建指定数字的张量
Y = nd.array([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
4、生成正态分布的张量,前两个输入代表均值和标准差
nd.random.normal(0, 1, shape=(3, 4))
5、张量之间的拼接:
nd.concat(X,Y,dim=0)
(dim=1就是按列拼接)
6、X==Y
可以用来把对应位置元素相等的值取出来,相等的值为1,不相等的值为0
7、对张量中的所有元素求和
X.sum()
8、我们也可以把Y.exp()
、X.sum()
、X.norm()
等分别改写为nd.exp(Y)
、nd.sum(X)
、nd.norm(X)
等。
9、我们可以通过asscalar
函数将结果变换为Python中的标量。下面例子中X
的
L
2
L_2
L2范数结果同上例一样是单元素NDArray
,但最后结果变换成了Python中的标量。
X.norm().asscalar()
索引
在NDArray
中,索引(index)代表了元素的位置。NDArray
的索引从0开始逐一递增。例如,一个3行2列的矩阵的行索引分别为0、1和2,列索引分别为0和1。在下面的例子中,我们指定了NDArray
的行索引截取范围[1:3]
。依据左闭右开指定范围的惯例,它截取了矩阵X
中行索引为1和2的两行。
我们可以指定NDArray
中需要访问的单个元素的位置,如矩阵中行和列的索引,并为该元素重新赋值。
X[1, 2] = 9
当然,我们也可以截取一部分元素,并为它们重新赋值。在下面的例子中,我们为行索引为1的每一列元素重新赋值。
X[1:2, :] = 12
NDArray
和NumPy相互变换
我们可以通过array
函数和asnumpy
函数令数据在NDArray
和NumPy格式之间相互变换。下面将NumPy实例变换成NDArray
实例。
import numpy as np
P = np.ones((2,3))
D = nd.array(P)
D.asnumpy()
自动求梯度
from mxnet import autograd
我们先看一个简单例子:对函数
y
=
2
x
⊤
x
y = 2\boldsymbol{x}^{\top}\boldsymbol{x}
y=2x⊤x 求关于列向量
x
\boldsymbol{x}
x 的梯度。我们先创建变量x
,并赋初值。
x = nd.arange(4).reshape((4, 1))
为了求有关变量x
的梯度,我们需要先调用attach_grad
函数来申请存储梯度所需要的内存。
x.attach_grad()
下面定义有关变量x
的函数。为了减少计算和内存开销,默认条件下MXNet不会记录用于求梯度的计算。我们需要调用record
函数来要求MXNet记录与求梯度有关的计算。
with autograd.record():
y = 2 * nd.dot(x.T, x)
由于x
的形状为(4, 1),y
是一个标量。接下来我们可以通过调用backward
函数自动求梯度。需要注意的是,如果y
不是一个标量,MXNet将默认先对y
中元素求和得到新的变量,再求该变量有关x
的梯度。
y.backward()
函数
y
=
2
x
⊤
x
y = 2\boldsymbol{x}^{\top}\boldsymbol{x}
y=2x⊤x 关于
x
\boldsymbol{x}
x 的梯度应为
4
x
4\boldsymbol{x}
4x。现在我们来验证一下求出来的梯度是正确的。
训练模式和预测模式
从上面可以看出,在调用record
函数后,MXNet会记录并计算梯度。此外,默认情况下autograd
还会将运行模式从预测模式转为训练模式。这可以通过调用is_training
函数来查看。
- MXNet提供
autograd
模块来自动化求导过程。 - MXNet的
autograd
模块可以对一般的命令式程序进行求导。 - MXNet的运行模式包括训练模式和预测模式。我们可以通过
autograd.is_training()
来判断运行模式。