zoukankan      html  css  js  c++  java
  • 深度学习 mxnet的基本操作

    from mxnet import nd

    创建向量

    #创建行向量
    x=nd.arange(12)
    print(x)
    #输出x的size
    print(x.shape)
    #把向量x的形状改成(3,4)
    X = x.reshape(3,4)
    print(X)
    Y = x.reshape(3,-1)
    print(Y)
    #创建一个各元素为0,形状为(2,3,4)的张量
    Z = nd.zeros((2,3,4))
    print(Z)
    #通过list指定需要创建的NDArray中每个元素的值
    X2 = nd.array([[2,1,4,3],[1,2,3,4],[4,3,2,1]])
    print(X2)
    #随机生成NDArray中每个元素的值
    X3 = nd.random.normal(0,1,shape=(3,4))
    print(X3)

    数据操作

    print(X+Y)
    #按元素乘法
    print(X*Y)
    #按元素除法
    print(X/Y)
    #按元素做指数运算
    print(Y.exp())
    #dot矩阵乘法
    print(nd.dot(X,Y.T))
    #矩阵连接
    #按行连接
    print(nd.concat(X,Y,dim=0))
    #按列连接
    print(nd.concat(X,Y,dim=1))
    #X == Y
    print(X == Y)
    #X.sum
    print(X.sum())
    #我们可以通过asscalar函数将结果变换为Python中的标量。下⾯例⼦中X的L2范数结果同上例
    #⼀样是单元素NDArray,但最后结果变换成了Python中的标量。
    print(X.norm().asscalar())

    广播机制

    '''
    当对两个形状不同的NDArray按
    元素运算时,可能会触发⼴播(broadcasting)机制:先适当复制元素使这两个NDArray形状相
    同后再按元素运算。
    '''
    A = nd.arange(3).reshape((3,1))
    B = nd.arange(2).reshape((1,2))
    print(A)
    print(B)
    '''
    由于A和B分别是3⾏1列和1⾏2列的矩阵,如果要计算A + B,那么A中第⼀列的3个元素被⼴播
    (复制)到了第⼆列,而B中第⼀⾏的2个元素被⼴播(复制)到了第⼆⾏和第三⾏。如此,就可以
    对2个3⾏2列的矩阵按元素相加。
    '''
    print(A+B)
    
    #索引
    '''
    例如,⼀个3⾏2列的矩阵的⾏索引分别为0、 1和2,列索引分别为0和1。
    '''
    print(X)
    print(X[1:3])
    '''
    指定NDArray中需要访问的单个元素的位置,如矩阵中⾏和列的索引,并为该元素重新赋值
    '''
    X[1,2] = 9
    '''
    截取⼀部分元素,并为它们重新赋值。在下⾯的例⼦中,我们为⾏索引为1的每⼀列元素重新赋值
    '''
    X[1:2,:] = 12
    print(X)

    运算内存开销

    '''
    截取⼀部分元素,并为它们重新赋值。在下⾯的例⼦中,我们为⾏索引为1的每
    ⼀列元素重新赋值
    如果想指定结果到特定内存,我们可以使⽤前⾯介绍的索引来进⾏替换操作。在下⾯的例⼦中,
    我们先通过zeros_like创建和Y形状相同且元素为0的NDArray,记为Z。
    '''
    Z = Y.zeros_like()
    before = id(Z)
    Z[:] = X+Y
    print(id(Z) == before)
    '''
    实际上,上例中我们还是为X + Y开了临时内存来存储计算结果,再复制到Z对应的内存。如果
    想避免这个临时内存开销,我们可以使⽤运算符全名函数中的out参数。
    '''
    nd.elemwise_add(X,Y,out=Z)
    print(id(Z) == before)
    '''
    如果X的值在之后的程序中不会复⽤,我们也可以⽤ X[:] = X + Y 或者 X += Y 来减少运算的内存开销
    '''
    before = id(X)
    X += Y
    print(id(X) == before)

    NDArray和Numpy相互变换

    import numpy as np
    
    #将Numpy实例变换成NDArray实例
    P = np.ones(  (2,3) )
    D = nd.array(P)
    print(P)
    print(D)
    
    #将NDArray实例变换成Numpy实例
    D = D.asnumpy()
    print("==================")
    print( type(D) )

     自动求梯度

    from mxnet import autograd,nd
    # 对函数 y = 2x⊤x 求关于列向量 x 的梯度。我们先创建变量x,并赋初值。
    x = nd.arange(4).reshape((4,1))
    #为了求有关变量x的梯度,我们需要先调⽤attach_grad函数来申请存储梯度所需要的内存
    x.attach_grad()
    #下⾯定义有关变量x的函数。为了减少计算和内存开销,默认条件下MXNet不会记录⽤于求梯度
    # 的计算。我们需要调⽤record函数来要求MXNet记录与求梯度有关的计算。
    with autograd.record():
        y = 3*nd.dot(x.T,x)
        #通过调⽤backward函数⾃动求梯度。
        print(y)
        y.backward()
        print(x.grad)
  • 相关阅读:
    itextpdf 和 pdfbox 测试用例
    Java base64 编码、解码
    常用字体
    DIY 单片机 入门
    太难了。
    Java 之 native:JNI 本地方法测试实现
    Java 之 String 引用传递
    Java class 文件 方法的指令含义
    Spring学习文章链接
    数据结构_树_图_总结
  • 原文地址:https://www.cnblogs.com/xiaochi/p/12608205.html
Copyright © 2011-2022 走看看