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)