- 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 胶子
- Apache MXNet - Python API 自动分级和初始化程序
- Apache MXNet - Python API 符号
- Apache MXNet - Python API 模块
- Apache MXNet 有用资源
- Apache MXNet - 快速指南
- Apache MXNet - 有用资源
- Apache MXNet - 讨论
Python API Autograd 和初始化器
本章讨论 MXNet 中的 autograd 和初始化器 API。
mxnet.autograd
这是 MXNet 的 NDArray 自动分级 API。它有以下类别 -
类:函数()
它用于 autograd 中的定制微分。它可以写成mxnet.autograd.Function。如果出于某种原因,用户不想使用默认链规则计算的梯度,那么他/她可以使用 mxnet.autograd 的 Function 类来自定义微分计算。它有两个方法,即Forward()和Backward()。
让我们借助以下几点来了解此类的工作 -
首先,我们需要在前向方法中定义我们的计算。
然后,我们需要在后向方法中提供定制的微分。
现在,在梯度计算过程中,mxnet.autograd 将使用用户定义的后向函数,而不是用户定义的后向函数。我们还可以转换为 numpy 数组并返回,以进行向前和向后的某些操作。
例子
在使用 mxnet.autograd.function 类之前,我们先定义一个具有后向和前向方法的稳定 sigmoid 函数,如下所示 -
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 类的方法及其参数 -
方法及其参数 | 定义 |
---|---|
向前(头[,head_grads,retain_graph,...]) | 该方法用于前向计算。 |
向后(头[,head_grads,retain_graph,...]) | 该方法用于向后计算。它计算相对于先前标记的变量的头部的梯度。此方法接受与转发的输出一样多的输入。它还返回与转发输入一样多的 NDArray。 |
获取符号(x) | 此方法用于检索记录的计算历史记录作为Symbol。 |
grad(头,变量[,head_grads,...]) | 该方法计算头部相对于变量的梯度。计算完成后,梯度将作为新的 NDArray 返回,而不是存储到 Variable.grad 中。 |
is_recording() | 借助此方法,我们可以获得录制和未录制的状态。 |
is_training() | 借助这种方法,我们可以获得训练和预测的状态。 |
mark_variables(变量, 梯度[, grad_reqs]) | 此方法将 NDArray 标记为变量来计算 autograd 的梯度。此方法与变量中的函数 .attach_grad() 相同,但唯一的区别是通过此调用我们可以将梯度设置为任何值。 |
暂停([火车模式]) | 此方法返回一个范围上下文,用于不需要计算梯度的代码的“with”语句。 |
预测模式() | 此方法返回要在“with”语句中使用的范围上下文,其中前向传递Behave设置为推理模式,并且不更改记录状态。 |
记录([火车模式]) | 它将返回要在“with”语句中使用的自动梯度记录范围上下文,并捕获需要计算梯度的代码。 |
设置录音(正在录音) | 与 is_recoring() 类似,借助该方法我们可以获取正在录制和未录制的状态。 |
设置训练(正在训练) | 与 is_traininig() 类似,借助此方法,我们可以将状态设置为训练或预测。 |
火车模式() | 此方法将返回要在“with”语句中使用的范围上下文,其中前向传递Behave设置为训练模式,并且不更改记录状态。 |
实施例
在下面的示例中,我们将使用 mxnet.autograd.grad() 方法来计算 head 相对于变量的梯度 -
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.初始化器
这是用于称重初始值设定项的 MXNet API。它有以下类 -
类及其参数
以下是mxnet.autogard.function类的方法及其参数:
类及其参数 | 定义 |
---|---|
双线性() | 在此类的帮助下,我们可以初始化上采样层的权重。 |
常数(值) | 此类将权重初始化为给定值。该值可以是标量,也可以是与要设置的参数的形状相匹配的 NDArray。 |
FusedRNN(init, num_hidden, num_layers, 模式) | 顾名思义,此类初始化融合循环神经网络 (RNN) 层的参数。 |
初始化描述 | 它充当初始化模式的描述符。 |
初始化器(**kwargs) | 这是初始化器的基类。 |
LSTMBias([forget_bias]) | 此类将 LSTMCell 的所有偏差初始化为 0.0,但忘记门除外,其偏差设置为自定义值。 |
加载(参数[,default_init,详细]) | 此类通过从文件或字典加载数据来初始化变量。 |
MSRAPrelu([因子类型,斜率]) | 顾名思义,这个类根据 MSRA 论文初始化权重。 |
混合(模式、初始值设定项) | 它使用多个初始值设定项来初始化参数。 |
正常([西格玛]) | Normal() 类使用从均值为零、标准差 (SD) 为sigma的正态分布中采样的随机值来初始化权重。 |
一() | 它将参数的权重初始化为一。 |
正交([尺度,rand_type]) | 顾名思义,此类将权重初始化为正交矩阵。 |
制服([比例]) | 它使用从给定范围内均匀采样的随机值来初始化权重。 |
泽维尔([rnd_type,factor_type,幅度]) | 它实际上返回一个初始化器,该初始化器对权重执行“Xavier”初始化。 |
零() | 它将参数的权重初始化为零。 |
实施例
在下面的示例中,我们将使用 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.]