深度學習 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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM