动手学深度学习之预备知识(MXNET)

馋奶兔 提交于 2020-02-11 17:10:09

动手学深度学习之预备知识(MXNET)

1、数据操作

MXNET中NDArray类:存储和变换数据的主要工具,提供GPU计算和自动求梯度功能,与NumPy的多维数组类似。

导入模块也称作包含的头文件(nd是ndarray的缩写)

from mxnet import nd
  • arange函数创建行向量
  • shape属性获取NDArray实例的形状(维度)
  • size属性得到NDArray实例中元素的总数
  • reshape函数修改形状为矩阵
X=x.reshape((3,4))   #生成3*4的矩阵
  • nd.zeros((2,3,4)) #生成两组3*4的矩阵,各个元素都为0
    nd.ones(3,4)      #生成元素为1的矩阵
    

随机生成NDArray中每个元素的值

nd.random.normal(0,1,shape=(3,4))    #均值为0,方差为1的正态分布3*4矩阵

支持加减乘除指数等运算(乘法为对应元素相乘)

矩阵乘法(需要保证维度一致)

  • nd.dot(X,Y.T)
    
  • nd.concat(X,Y,dim=0),nd.concat(X,Y,dim=1)#在行上、连上连接两个矩阵
    X==Y #判断对应元素是否相等,若相等则为1,若不相等为0
    X.sum()  #对所有元素求和
    X.norm().asscalar()   #norm求所有元素的平方根,.asscalar()把向量转换为标量
    

广播机制

原因:当对两个形状不同的NDArray按元素运算时,可能会触发广播机制(broadcasting)

操作:先适当复制元素使这两个形状相同后再按元素运算

EXAMPLE
A=nd.arange(3).reshape((3,1))
B=nd.arange(2).reshape((1,2))
A+B            #先复制第一列到第二列,对第二列中与B中对应的元素相加

索引

X[1:3]   #取矩阵X中第1,2行
X[1,2]=9  #修改具体元素
X[1:2, :]=12  #对行索引为1的元素重新赋值

运算的内存开销

before = id(Y)     #查看内存地址
Y = Y + X
id(Y) == before


###指定到特定内存当中


Z = Y.zeros_like()   
before = id(Z)
Z[:] = X + Y
id(Z) == before


###避免开启临时内存


nd.elemwise_add(X, Y, out=Z)
id(Z) == before

NDArray与NumPy相互变换

import numpy as np

P = np.ones((2, 3))
D = nd.array(P)       ###  将numpy->ndarray


D.asnumpy()          ###   将ndarray->numpy

总结:

  • NDArray是MXNet中存储和变换数据的主要工具
  • 可以轻松地对NDArray创建、运算、指定索引,并与Numpy之间相互变换

2、自动求取梯度

MXNet中提供自动求梯度模块 autograd

from mxnet import autograd, nd
x=nd.arange(4).reshape((4,1))
x.attach_grad()    #调用attach_grad函数来申请存储梯度所需要的内存
with autograd.record():    #record()记录与梯度有关的计算
    y=2*nd.dot(x.T,x)
y.backward()         #调用backward函数自动求梯度

对python控制流求梯度

def f(a):
    b = a * 2
    while b.norm().asscalar() < 1000:
        b = b * 2
    if b.sum().asscalar() > 0:
        c = b
    else:
        c = 100 * b
    return c


a = nd.random.normal(shape=1)    
a.attach_grad()
with autograd.record():
    c = f(a)
c.backward()
a.grad ==c/a     #用于验证结果

训练模式和预测模式

aotograd会将运行模式从预测模式转为训练模式

print(autograd.is_training())
with autograd.record():
    print(autograd.is_training())

3、查阅文档

3.1 查找模块里的所有函数和类

查询一个模块提供了哪些可以调用的函数和类时,可以使用dir函数

from mxnet import nd
print(dir(nd.random))

通常我们可以忽略掉由__开头和结尾的函数(Python的特别对象)或者由_开头的函数(一般为内部函数)。通过其余成员的名字我们大致猜测出这个模块提供了各种随机数的生成方法,包括从均匀分布采样(uniform)、从正态分布采样(normal)、从泊松分布采样(poisson)等。

3.2 查找特定函数和类的使用

help(nd.ones_like)
nd.random.uniform?    #显示在额外的窗口里
help(nd.random.uniform)  #显示在当前窗口里
nd.random.uniform??   #显示该函数实现的代码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!