
- Apache MXNet 教程
- Apache MXNet - 首頁
- Apache MXNet - 簡介
- Apache MXNet - 安裝 MXNet
- Apache MXNet - 工具包和生態系統
- Apache MXNet - 系統架構
- Apache MXNet - 系統元件
- Apache MXNet - 統一運算元 API
- Apache MXNet - 分散式訓練
- Apache MXNet - Python 包
- Apache MXNet - NDArray
- Apache MXNet - Gluon
- Apache MXNet - KVStore 和視覺化
- Apache MXNet - Python API ndarray
- Apache MXNet - Python API gluon
- Apache MXNet - Python API 自動微分和初始化器
- Apache MXNet - Python API Symbol
- Apache MXNet - Python API Module
- Apache MXNet 有用資源
- Apache MXNet - 快速指南
- Apache MXNet - 有用資源
- Apache MXNet - 討論
Python API 自動微分和初始化器
本章介紹 MXNet 中的自動微分和初始化器 API。
mxnet.autograd
這是 MXNet 的 NDArray 自動微分 API。它包含以下類:
類:Function()
它用於在自動微分中進行自定義微分。可以寫成 **mxnet.autograd.Function**。如果出於任何原因,使用者不想使用預設鏈式法則計算的梯度,那麼他/她可以使用 mxnet.autograd 的 Function 類來自定義微分進行計算。它有兩個方法,分別是 Forward() 和 Backward()。
讓我們透過以下幾點來了解這個類的作用:
首先,我們需要在 forward 方法中定義我們的計算。
然後,我們需要在 backward 方法中提供自定義微分。
現在,在梯度計算期間,mxnet.autograd 將使用使用者定義的 backward 函式,而不是使用者定義的 backward 函式。我們也可以在 forward 和 backward 中強制轉換為 numpy 陣列並返回,以進行某些操作。
示例
在使用 mxnet.autograd.function 類之前,讓我們定義一個穩定的 sigmoid 函式,其中包含 backward 和 forward 方法,如下所示:
class sigmoid(mx.autograd.Function): def forward(self, x): y = 1 / (1 + mx.nd.exp(-x)) self.save_for_backward(y) return y def backward(self, dy): y, = self.saved_tensors return dy * y * (1-y)
現在,函式類可以按如下方式使用:
func = sigmoid() x = mx.nd.random.uniform(shape=(10,)) x.attach_grad() with mx.autograd.record(): m = func(x) m.backward() dx_grad = x.grad.asnumpy() dx_grad
輸出
執行程式碼時,您將看到以下輸出:
array([0.21458015, 0.21291625, 0.23330082, 0.2361367 , 0.23086983, 0.24060014, 0.20326573, 0.21093895, 0.24968489, 0.24301809], dtype=float32)
方法及其引數
以下是 mxnet.autogard.function 類的所有方法及其引數:
方法及其引數 | 定義 |
---|---|
forward (heads[, head_grads, retain_graph, …]) | 此方法用於前向計算。 |
backward(heads[, head_grads, retain_graph, …]) | 此方法用於反向計算。它計算 heads 相對於先前標記變數的梯度。此方法接受與 forward 輸出一樣多的輸入。它還返回與 forward 輸入一樣多的 NDArray。 |
get_symbol(x) | 此方法用於檢索記錄的計算歷史作為 **Symbol**。 |
grad(heads, variables[, head_grads, …]) | 此方法計算 heads 相對於 variables 的梯度。計算完成後,梯度將作為新的 NDArrays 返回,而不是儲存到 variable.grad 中。 |
is_recording() | 藉助此方法,我們可以獲取關於記錄和不記錄的狀態。 |
is_training() | 藉助此方法,我們可以獲取關於訓練和預測的狀態。 |
mark_variables(variables, gradients[, grad_reqs]) | 此方法將 NDArrays 標記為變數,以便為自動微分計算梯度。此方法與變數中的函式 .attach_grad() 相同,但唯一的區別在於,透過此呼叫,我們可以將梯度設定為任何值。 |
pause([train_mode]) | 此方法返回一個作用域上下文,用於在“with”語句中使用,用於不需要計算梯度的程式碼。 |
predict_mode() | 此方法返回一個作用域上下文,用於在“with”語句中使用,其中前向傳遞行為設定為推理模式,而不會更改記錄狀態。 |
record([train_mode]) | 它將返回一個 **autograd** 記錄作用域上下文,用於在“with”語句中使用,並捕獲需要計算梯度的程式碼。 |
set_recording(is_recording) | 類似於 is_recoring(),藉助此方法,我們可以獲取關於記錄和不記錄的狀態。 |
set_training(is_training) | 類似於 is_traininig(),藉助此方法,我們可以將狀態設定為訓練或預測。 |
train_mode() | 此方法將返回一個作用域上下文,用於在“with”語句中使用,其中前向傳遞行為設定為訓練模式,而不會更改記錄狀態。 |
實現示例
在下面的示例中,我們將使用 mxnet.autograd.grad() 方法來計算 head 相對於 variables 的梯度:
x = mx.nd.ones((2,)) x.attach_grad() with mx.autograd.record(): z = mx.nd.elemwise_add(mx.nd.exp(x), x) dx_grad = mx.autograd.grad(z, [x], create_graph=True) dx_grad
輸出
輸出如下所示:
[ [3.7182817 3.7182817] <NDArray 2 @cpu(0)>]
我們可以使用 mxnet.autograd.predict_mode() 方法返回一個作用域,用於在“with”語句中使用:
with mx.autograd.record(): y = model(x) with mx.autograd.predict_mode(): y = sampling(y) backward([y])
mxnet.intializer
這是 MXNet 的權重初始化器 API。它包含以下類:
類及其引數
以下是 **mxnet.autogard.function** 類的所有方法及其引數
類及其引數 | 定義 |
---|---|
Bilinear() | 藉助此類,我們可以初始化上取樣層的權重。 |
Constant(value) | 此類將權重初始化為給定值。該值可以是標量,也可以是與要設定的引數形狀匹配的 NDArray。 |
FusedRNN(init, num_hidden, num_layers, mode) | 顧名思義,此類初始化融合迴圈神經網路 (RNN) 層的引數。 |
InitDesc | 它充當初始化模式的描述符。 |
Initializer(**kwargs) | 這是初始化器的基類。 |
LSTMBias([forget_bias]) | 此類將 LSTMCell 的所有偏差初始化為 0.0,但遺忘門的偏差設定為自定義值除外。 |
Load(param[, default_init, verbose]) | 此類透過從檔案或字典載入資料來初始化變數。 |
MSRAPrelu([factor_type, slope]) | 顧名思義,此類根據 MSRA 論文初始化權重。 |
Mixed(patterns, initializers) | 它使用多個初始化器初始化引數。 |
Normal([sigma]) | Normal() 類使用從均值為零、標準差 (SD) 為 **sigma** 的正態分佈中取樣的隨機值初始化權重。 |
One() | 它將引數的權重初始化為 1。 |
Orthogonal([scale, rand_type]) | 顧名思義,此類將權重初始化為正交矩陣。 |
Uniform([scale]) | 它使用從給定範圍內均勻取樣的隨機值初始化權重。 |
Xavier([rnd_type, factor_type, magnitude]) | 它實際上返回一個初始化器,該初始化器對權重執行“Xavier”初始化。 |
Zero() | 它將引數的權重初始化為 0。 |
實現示例
在下面的示例中,我們將使用 mxnet.init.Normal() 類建立初始化器並檢索其引數:
init = mx.init.Normal(0.8) init.dumps()
輸出
輸出如下所示:
'["normal", {"sigma": 0.8}]'
示例
init = mx.init.Xavier(factor_type="in", magnitude=2.45) init.dumps()
輸出
輸出如下所示:
'["xavier", {"rnd_type": "uniform", "factor_type": "in", "magnitude": 2.45}]'
在下面的示例中,我們將使用 mxnet.initializer.Mixed() 類使用多個初始化器初始化引數:
init = mx.initializer.Mixed(['bias', '.*'], [mx.init.Zero(), mx.init.Uniform(0.1)]) module.init_params(init) for dictionary in module.get_params(): for key in dictionary: print(key) print(dictionary[key].asnumpy())
輸出
輸出如下所示:
fullyconnected1_weight [[ 0.0097627 0.01856892 0.04303787]] fullyconnected1_bias [ 0.]