学习MXnet笔记
1.NDArray部分
1.合并多个NDArray,nd.concat(x,y,dim=0), eg:
x=[[ 0. 1. 2.]
[ 3. 4. 5.]]
y=[[1. 2. 3.]
[2. 3. 4.]]
nd.concat(x,y,dim=0)#在行(维度0)上连结两个矩阵
得到:
[[ 0. 1. 2.]
[ 3. 4. 5.]
[1. 2. 3.]
[2. 3. 4.]]
nd.concat(x,y,dim=1)#在列(维度1)上连结两个矩阵
得到:
[[ 0. 1. 2. 1. 2. 3.]
[ 3. 4. 5. 2. 3. 4.] ]
2.使用nd.arange(n)创建一个[0,n-1]的行向量
3.NDArray索引从0开始,注意x[1:3]依据左闭右开指定范围的惯例,截取的是矩阵行索引1和2(实际指第2和第3行)的数据
4.运算的内存开销
x y均为NDArray
y=x+y
此处y前后并不是指向同一个内存,运算过程中会新创建内存,然后将y指向新内存,原内存自动释放(?)
z=y.zeros_like()
z[:]=x+y
此处z前后均指向同一个内存,但运算中会为x+y创建临时内存来存储计算结果,再复制到z对应的内存
nd.elemwise_add(x,y,out=z)
将上面的x+y改写为利用运算符全名函数中的out参数,可避免这个临时内存开销
如果x的值在之后的程序中不会复用可用
x[:]=x+y
或者
x+=y
来减少运算的内存开销,这两种方式x前后均指向同一个内存,但运算过程中应该还是会创建临时内存.
个人认为内存开销最小的方式为
nd.elemwise_add(x,y,out=x)
5.NDArray和NumPy转换
numpy到NDArray
p=np.ones((2,3))
d=nd.array(p)
NDArray到NumPy
d.asnumpy()
6.自动求梯度
from mxnet import autograd x=nd.arange(4).reshape((4,1)) x.attach_grad() #申请存储梯度所需内存 with autograd.record(): #这一步是为了能查看x的梯度值 默认是不会记录中间结果的 y=2*nd.dot(x.T,x) y.backward() x.grad
注意,若y不是一个标量,MXNet将默认先对y中元素求和得到新的变量,再求该变量有关x的梯度。
根据损失函数来看,该求导机制合理。