MXNet之NDArray 速查

MXNet 中的庫 NDArray 相似於 NumPy,區別在於 NDArray 能夠利用 GPU 進行加速以及自動求梯度bash

建立 NDArray

from mxnet import nd
# 建立向量
x = nd.arange(12)
# 得到 x 的形狀
x.shape
# 得到 x 中的元素數
x.size
# 將 x 改成 3x4 的矩陣
X = x.reshape((3,4)) # x.reshape((-1,4)) or x.reshape((3,-1))
# 各元素都爲0,形狀爲 2,3,4 的張量
x = nd.zeros((2,3,4))
# 各元素爲 1 的張量
nd.ones((2,3,4))
# 使用 list 初始化
nd.array([[1,2,3],[4,5,6]])
# 產生均值爲0,標準差爲1的正態分佈
nd.random.normal(0,1,shape=(3,4))
複製代碼

運算

按元素運算dom

# 按元素乘法
x * y
# 按元素除法
x / y
# 按元素加法
x + y
# 按元素作指數運算
x.exp()
複製代碼

矩陣乘法函數

# 假設X、Y矩陣均爲3行4列,則矩陣X與Y的轉置相乘的結果爲3行3列
nd.dot(X, Y.T)
複製代碼

矩陣鏈接學習

# 假設x和y都是3x4的矩陣,nd.concat將x和y連起來,dim=0表示擴展行
nd.concat(x, y, dim=0)
# dim=1表示擴展列
nd.concat(x, y, dim=1)
複製代碼

兩個同形狀的張量,能夠按相同位置進行比較、判斷是否相等,相等位1,不然爲0,返回新的張量spa

x == y
複製代碼

對全部元素求和,返回值依然是一個 NDArrayscala

x.sum()
複製代碼

能夠將上式返回的 NDarray 轉換爲一個標量code

x.sum().asscalar()
複製代碼

求標量中全部元素的L2範數(平方和再開更號)orm

x.norm()
複製代碼

廣播機制

不一樣形狀張量按元素運算,先複製元素使它們形狀相同,再進行計算對象

x = nd.arange(3).reshape((3,1))
y = nd.arange(2).reshape((1,2))
x + y
複製代碼

索引

行或列的索引都從0開始,聽從左閉右開原則索引

# 得到某個元素,並從新賦值,第2行,第3列
X[1,2] = 9
# 獲取第二、3行的全部元素
X[1:3]
# 截取一部分元素(第二、3行的全部元素),並從新賦值
X[1:3,:] = 12
複製代碼

NDArray 和 NumPy 互換

經過 array 將 NumPy 對象轉換爲 NDArray 對象

import numpy as np
P = np.ones((2,3))
D = nd.array(P)
D
複製代碼

將 NDArray 轉換爲 NumPy

D.asnumpy()
複製代碼

自動求梯度

梯度的概念

x 爲一個向量 \left[x_1,x_2,\dots,x_n\right]^\top,關於 x 的函數 f(x) 的梯度能夠表示爲

\nabla f(x) = \left[ \frac{\partial f(x)}{\partial x_1}, \frac{\partial f(x)}{\partial x_2}, \dots, \frac{\partial f(x)}{\partial x_n} \right]

使用 MXNet 自動求梯度的步驟:

  1. 導入 autograd 庫:from mxnet import autograd, nd
  2. 標記須要求梯度的參數 x.attach_grad(),其中 x 爲參數,它是一個向量
  3. autograd.record(),記錄求梯度的計算,默認狀況下 MXNet 不會記錄(可選)
  4. 經過 backward 函數自動求梯度

例如咱們對 y=2x^\top x 自動求梯度的代碼以下

from mxnet import autograd, nd

x = nd.arange(4).reshape((4,1))
x.attach_grad()
with autograd.record():
    y = 2 * nd.dot(x.T, x)

y.backward()
x.grad
----
output:
[[ 0.]
 [ 4.]
 [ 8.]
 [12.]]
<NDArray 4x1 @cpu(0)>
複製代碼

本文來自《動手學深度學習》預備知識的讀書筆記

相關文章
相關標籤/搜索