学习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的梯度。

 根据损失函数来看,该求导机制合理。

posted @ 2018-11-29 15:47  Gaaray  阅读(629)  评论(0编辑  收藏  举报