gluon下的基本操作

在 MXNet 中,NDArray 是存储和变换数据的主要⼯具。他和numpy十分相似。
1、创建张量
然后我们⽤ arange 函数创建⼀个⾏向量。
In [2]: x = nd.arange(12)
x
Out[2]:
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.]
创建了一个12个整数的数组;
我们还可以用shape来获取数组的形状:
In [3]: x.shape
Out[3]: (12,)
我们也能够通过 size 属性得到 NDArray 实例中元素(element)的总数。
In [4]: x.size
Out[4]: 12

我们还可以用reshape来重塑数组形状
In [5]: x = x.reshape((3, 4))
x
Out[5]:
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
<NDArray 3x4 @cpu(0)>

nd.zeros((2, 3, 4))就是创建一个形状为(2,3,4)的张量,数组和矩阵都是特殊的张量。
nd.ones((3, 4))创建元素都是1的张量。
我们也可以通过 Python 的列表(list)指定需要创建的 NDArray 中每个元素的值。
In [8]: y = nd.array([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

: nd.random.normal(0, 1, shape=(3, 4)),生成均值为0,标准差为1 的正态分布。

2、运算
运算包括加减乘除,矩阵运算,合并,广播,指数运算,索引等。不详细介绍,学过numpy的都清楚这些运算。

3、NDArray 和 NumPy 相互变换
我们可以通过 array 和 asnumpy 函数令数据在 NDArray 和 NumPy 格式之间相互变换。

4、自动求梯度
我们先看⼀个简单例⼦:对函数 y = 2x⊤x 求关于列向量 x 的梯度。我们先创建变量 x,并赋初值。
In [2]: x = nd.arange(4).reshape((4, 1))

Out[2]:
[[0.]
[1.]
[2.]
[3.]]
<NDArray 4x1 @cpu(0)>
为了求有关变量 x 的梯度,我们需要先调⽤ attach_grad 函数来申请存储梯度所需要的内存。
In [3]: x.attach_grad()
下⾯定义有关变量 x 的函数。为了减少计算和内存开销,默认条件下 MXNet 不会记录⽤于求梯度的计算。我们需要调⽤ record 函数来要求 MXNet 记录与求梯度有关的计算。
In [4]: with autograd.record():
y = 2 * nd.dot(x.T, x)
由于 x 的形状为(4, 1),y 是⼀个标量。接下来我们可以通过调⽤ backward 函数⾃动求梯度。
需要注意的是,如果 y 不是⼀个标量,MXNet 将默认先对 y 中元素求和得到新的变量,再求该变量有关 x 的梯度。
In [5]: y.backward()
函数 y = 2x ⊤x 关于 x 的梯度应为 4x。现在我们来验证⼀下求出来的梯度是正确的。
In [6]: assert (x.grad - 4 * x).norm().asscalar() == 0
x.grad
Out[6]:
[[ 0.]
[ 4.]
[ 8.]
[12.]]
<NDArray 4x1 @cpu(0)>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值