第2章 预备知识
2.2 数据操作
2.2.2 运算
dot函数可以做矩阵乘法:
nd.dot(x,y.T) #矩阵x和矩阵y的转置做矩阵乘法
连结运算:
nd.concat(y,z,dim=1) #在维度1(列)上做连结运算,可以理解为拼接在一起
#如果参数dim=0, 则表示在行上做连结
条件判别式得到元素为0或1的新NDArray。如果x和y在相同位置的条件判断为真(值相等),那么新的NDArray在相同位置的值为1;反之为0:
x==y
对NDArray中所有元素求和得到只有一个元素的NDArray:
x.sum()
通过asscalar函数将结果变换为python中的标量
x.norm().asscalar() #将x的L2范数变换成python中的标量
2.2.3 广播机制
对形状不同的NDArray按元素运算时,会触发广播机制:先适当复制元素使这两个NDArray形状相同后再按元素运算。
2.2.4 索引
索引代表元素位置。NDArray的索引从0开始逐一递增。根据 左闭右开 指定范围,例如行索引截取范围[1:3],则截取矩阵中行索引为1和2的两行。
x[1:3] #行索引
x[:,1:3] #列索引
2.2.6 NDArray和NumPy相互变换
通过array函数和asnumpy函数令数据再NDArray和NumPy格式之间相互变换
#numpy转NDArray
import numpy as np
p=np.ones((3,4))
x=nd.array(p)
#NDArray转numpy
y=x.asnumpy()
2.3 自动求梯度
对函数 y = 2 x T x y = 2x^Tx y=2xTx求关于列向量x的梯度。
1.为了减少计算和内存开销,默认条件下MXNet不会记录用于求梯度的计算。我们需要调用record函数记录有关计算。
2.由于x的形状是(4,1),所以y是一个标量。如果y不是一个标量,MXNet将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度。
#调用attach_grad()函数来申请存储梯度所需要的内存
x.attach_grad()
print(x)
#调用record函数来要求MXNet记录与求梯度有关的计算
with autograd.record():
y=2*nd.dot(x.T,x)
#调用backward函数自动求梯度
y.backward()
assert (x.grad - 4*x).norm().asscalar()==0
print(x.grad)