Apache MXNet - Python API 符号


在本章中,我们将学习 MXNet 中的一个接口,称为 Symbol。

MXnet.ndarray

Apache MXNet 的 Symbol API 是符号编程的接口。Symbol API 的特点是使用以下内容 -

  • 计算图

  • 减少内存使用

  • 前置功能优化

下面给出的示例展示了如何使用 MXNet 的 Symbol API 创建一个简单的表达式 -

使用常规 Python 列表中的一维和二维“数组”的 NDArray -

import mxnet as mx
# Two placeholders namely x and y will be created with mx.sym.variable
x = mx.sym.Variable('x')
y = mx.sym.Variable('y')
# The symbol here is constructed using the plus ‘+’ operator.
z = x + y

输出

您将看到以下输出 -

<Symbol _plus0>

例子

(x, y, z)

输出

输出如下 -

(<Symbol x>, <Symbol y>, <Symbol _plus0>)

现在让我们详细讨论MXNet的ndarray API的类、函数和参数。

课程

下表包含 MXNet 的 Symbol API 的类 -

班级 定义
符号(手柄) 这个类即symbol是Apache MXNet的符号图。

函数及其参数

以下是 mxnet.Symbol API 涵盖的一些重要函数及其参数 -

功能及其参数 定义
激活([数据,act_type,输出,名称]) 它将激活函数逐元素应用于输入。它支持relu、sigmoid、tanh、softrelu、softsign激活函数。
BatchNorm([数据, gamma, beta, moving_mean, …]) 它用于批量标准化。该函数通过均值和方差对数据批次进行归一化。它应用缩放gamma和偏移beta
双线性采样器([数据,网格,cudnn_off,...]) 该函数对输入特征图应用双线性采样。实际上它是“空间变换网络”的关键。如果您熟悉OpenCV中的remap函数,那么该函数的用法与此非常相似。唯一的区别是它有向后传递。
BlockGrad([数据, 输出, 名称]) 正如名称所示,该函数停止梯度计算。它基本上阻止了输入的累积梯度向后流过该运算符。
强制转换([数据,数据类型,输出,名称]) 此函数会将输入的所有元素转换为新类型。
此函数会将输入的所有元素转换为新类型。 正如名称所指定的,该函数返回给定形状和类型的新符号,并用零填充。
个(形状[,dtype]) 正如名称所指定的,该函数返回给定形状和类型的新符号,并用 1 填充。
完整(形状,val[,dtype]) 此函数(如名称所指定)返回给定形状和类型的新数组,并用给定值val填充。
arange(开始[、停止、步骤、重复、...]) 它将返回给定间隔内均匀间隔的值。这些值是在半开区间 [start, stop) 内生成的,这意味着该区间包括start但不包括stop
linspace(开始、停止、num[、端点、名称、...]) 它将返回指定间隔内均匀分布的数字。与函数 array() 类似,值是在半开区间 [start, stop) 内生成的,这意味着该区间包含start但不包含stop
直方图(a[, bin, 范围]) 顾名思义,该函数将计算输入数据的直方图。
功率(基础值,经验值) 顾名思义,此函数将返回基元素从exp元素求幂的逐元素结果。两个输入(即基数和指数)可以是符号或标量。这里注意,不允许广播。如果你想使用广播的功能,可以使用broadcast_pow 。
SoftmaxActivation([数据、模式、名称、属性、输出]) 该函数将 softmax 激活应用于输入。它适用于内部层。它实际上已被弃用,我们可以使用softmax()代替。

实施示例

在下面的示例中,我们将使用函数power(),它将返回基元素从 exp 元素求幂的逐元素结果:

import mxnet as mx
mx.sym.power(3, 5)

输出

您将看到以下输出 -

243

例子

x = mx.sym.Variable('x')
y = mx.sym.Variable('y')
z = mx.sym.power(x, 3)
z.eval(x=mx.nd.array([1,2]))[0].asnumpy()

输出

这会产生以下输出 -

array([1., 8.], dtype=float32)

例子

z = mx.sym.power(4, y)
z.eval(y=mx.nd.array([2,3]))[0].asnumpy()

输出

当您执行上述代码时,您应该看到以下输出 -

array([16., 64.], dtype=float32)

例子

z = mx.sym.power(x, y)
z.eval(x=mx.nd.array([4,5]), y=mx.nd.array([2,3]))[0].asnumpy()

输出

输出如下 -

array([ 16., 125.], dtype=float32)

在下面给出的示例中,我们将使用函数SoftmaxActivation() (或 softmax()),该函数将应用于输入并用于内部层。

input_data = mx.nd.array([[2., 0.9, -0.5, 4., 8.], [4., -.7, 9., 2., 0.9]])
soft_max_act = mx.nd.softmax(input_data)
print (soft_max_act.asnumpy())

输出

您将看到以下输出 -

[[2.4258138e-03 8.0748333e-04 1.9912292e-04 1.7924475e-02 9.7864312e-01]
[6.6843745e-03 6.0796250e-05 9.9204916e-01 9.0463174e-04 3.0112563e-04]]

符号.contrib

Contrib NDArray API 在 symbol.contrib 包中定义。它通常为新功能提供许多有用的实验性 API。该 API 为社区提供了一个可以尝试新功能的地方。功能贡献者也会得到反馈。

函数及其参数

以下是mxnet.symbol.contrib API涵盖的一些重要函数及其参数-

功能及其参数 定义
rand_zipfian(true_classes, num_sampled, …) 该函数从近似 Zipfian 分布中抽取随机样本。该函数的基本分布是 Zipfian 分布。该函数对 num_sampled 候选者进行随机采样,sampled_candidates 的元素是从上面给出的基本分布中抽取的。
foreach(正文,数据,init_states) 顾名思义,该函数在维度 0 上对 NDArray 运行用户定义计算的循环。该函数模拟 for 循环,主体具有 for 循环迭代的计算。
while_loop(cond, func, Loop_vars[, …]) 顾名思义,该函数使用用户定义的计算和循环条件运行 while 循环。该函数模拟一个 while 循环,如果满足条件,该循环就会按字面意思进行定制计算。
条件(pred,then_func,else_func) 顾名思义,该函数使用用户定义的条件和计算运行 if-then-else。该函数模拟一个类似 if 的分支,该分支根据指定的条件选择执行两个自定义计算之一。
getnnz([数据、轴、输出、名称]) 该函数为我们提供了稀疏张量的存储值的数量。它还包括显式零。它仅支持 CPU 上的 CSR 矩阵。
重新量化([数据,最小范围,最大范围,...]) 该函数使用在运行时计算或通过校准计算的最小和最大阈值,将以 int32 和相应阈值量化的给定数据重新量化为 int8。
index_copy([旧张量,索引向量,...]) 该函数通过按照索引中给定的顺序选择索引,将 new_tensor 的元素复制到 old_tensor 中。该运算符的输出将是一个新张量,其中包含旧张量的其余元素和新张量的复制元素
interleaved_matmul_encdec_qk([查询, …]) 该运算符计算用作编码器-解码器的多头注意力中查询和键的投影之间的矩阵乘法。条件是输入应该是遵循布局的查询投影张量:(seq_length、batch_size、num_heads*、head_dim)。

实施示例

在下面的示例中,我们将使用函数 rand_zipfian 从近似 Zipfian 分布中抽取随机样本 -

import mxnet as mx
true_cls = mx.sym.Variable('true_cls')
samples, exp_count_true, exp_count_sample = mx.sym.contrib.rand_zipfian(true_cls, 5, 6)
samples.eval(true_cls=mx.nd.array([3]))[0].asnumpy()

输出

您将看到以下输出 -

array([4, 0, 2, 1, 5], dtype=int64)

例子

exp_count_true.eval(true_cls=mx.nd.array([3]))[0].asnumpy()

输出

输出如下 -

array([0.57336551])

例子

exp_count_sample.eval(true_cls=mx.nd.array([3]))[0].asnumpy()

输出

您将看到以下输出 -

array([1.78103594, 0.46847373, 1.04183923, 0.57336551, 1.04183923])

在下面的示例中,我们将使用函数while_loop运行 while 循环以进行用户定义的计算和循环条件 -

cond = lambda i, s: i <= 7
func = lambda i, s: ([i + s], [i + 1, s + i])
loop_vars = (mx.sym.var('i'), mx.sym.var('s'))
outputs, states = mx.sym.contrib.while_loop(cond, func, loop_vars, max_iterations=10)
print(outputs)

输出

输出如下:

[<Symbol _while_loop0>]

例子

Print(States)

输出

这会产生以下输出 -

[<Symbol _while_loop0>, <Symbol _while_loop0>]

在下面的示例中,我们将使用函数index_copy将 new_tensor 的元素复制到 old_tensor 中。

import mxnet as mx
a = mx.nd.zeros((6,3))
b = mx.nd.array([[1,2,3],[4,5,6],[7,8,9]])
index = mx.nd.array([0,4,2])
mx.nd.contrib.index_copy(a, index, b)

输出

当您执行上述代码时,您应该看到以下输出 -

[[1. 2. 3.]
[0. 0. 0.]
[7. 8. 9.]
[0. 0. 0.]
[4. 5. 6.]
[0. 0. 0.]]
<NDArray 6x3 @cpu(0)>

符号.图像

图像符号 API 在 symbol.image 包中定义。顾名思义,它通常用于图像及其特征。

函数及其参数

以下是mxnet.symbol.image API涵盖的一些重要函数及其参数-

功能及其参数 定义
adjustment_lighting([数据、alpha、输出、名称]) 顾名思义,此功能调整输入的照明级别。它遵循 AlexNet 风格。
作物([数据,x,y,宽度,高度,输出,名称]) 借助此函数,我们可以将形状为 (H x W x C) 或 (N x H x W x C) 的图像 NDArray 裁剪为用户指定的尺寸。
标准化([数据,平均值,标准差,输出,名称]) 它将使用平均值标准差 (SD)标准化形状 (C x H x W) 或 (N x C x H x W) 的张量。
random_crop([数据,x范围,y范围,宽度,...]) 与crop()类似,它随机将形状为(H x W x C)或(N x H x W x C)的图像NDArray裁剪为用户给定的尺寸。如果src小于size ,它将对结果进行上采样。
random_lighting([数据,alpha_std,输出,名称]) 顾名思义,该函数随机添加 PCA 噪声。它还遵循 AlexNet 风格。
random_resized_crop([数据, xrange, yrange, …]) 它还将形状 (H x W x C) 或 (N x H x W x C) 的图像随机裁剪为给定大小的 NDArray。如果 src 小于大小,它将对结果进行上采样。它也会随机化面积和纵横比。
调整大小([数据,大小,keep_ratio,interp,...]) 顾名思义,该函数会将形状为 (H x W x C) 或 (N x H x W x C) 的图像 NDArray 调整为用户指定的大小。
to_tensor([数据、输出、名称]) 它将形状为 (H x W x C) 或 (N x H x W x C) 且值在 [0, 255] 范围内的图像 NDArray 转换为形状为 (C x H x W) 或 ( N x C x H x W),其值在 [0, 1] 范围内。

实施示例

在下面的示例中,我们将使用函数 to_tensor 将形状 (H x W x C) 或 (N x H x W x C) 且值在 [0, 255] 范围内的图像 NDArray 转换为张量 NDArray形状为 (C x H x W) 或 (N x C x H x W),其值在 [0, 1] 范围内。

import numpy as np

img = mx.sym.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8)

mx.sym.image.to_tensor(img)

输出

输出如下:

<Symbol to_tensor4>

例子

img = mx.sym.random.uniform(0, 255, (2, 4, 2, 3)).astype(dtype=np.uint8)

mx.sym.image.to_tensor(img)

输出

输出如下:

<Symbol to_tensor5>

在下面的示例中,我们将使用函数 normalize() 使用均值标准差 (SD)对形状 (C x H x W) 或 (N x C x H x W) 的张量进行归一化。

img = mx.sym.random.uniform(0, 1, (3, 4, 2))

mx.sym.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))

输出

下面给出的是代码的输出 -

<Symbol normalize0>

例子

img = mx.sym.random.uniform(0, 1, (2, 3, 4, 2))

mx.sym.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))

输出

输出如下所示 -

<Symbol normalize1>

符号.随机

随机符号 API 在 symbol.random 包中定义。顾名思义,它是 MXNet 的随机分布生成器 Symbol API。

函数及其参数

以下是mxnet.symbol.random API涵盖的一些重要函数及其参数-

功能及其参数 定义
均匀([低,高,形状,dtype,ctx,out]) 它从均匀分布中生成随机样本。
正常([loc,比例,形状,dtype,ctx,out]) 它从正态(高斯)分布生成随机样本。
randn(*形状,**kwargs) 它从正态(高斯)分布生成随机样本。
泊松([lam,形状,dtype,ctx,out]) 它根据泊松分布生成随机样本。
指数([尺度,形状,dtype,ctx,输出]) 它根据指数分布生成样本。
伽玛([α,β,形状,dtype,ctx,out]) 它从伽玛分布生成随机样本。
多项式(数据[,形状,get_prob,输出,dtype]) 它从多个多项分布生成并发采样。
negative_binomial([k, p, 形状, dtype, ctx, out]) 它从负二项分布生成随机样本。
广义负二项式([mu, alpha, …]) 它从广义负二项分布生成随机样本。
洗牌(数据,**kwargs) 它随机地打乱元素。
randint(低, 高[, 形状, dtype, ctx, 输出]) 它从离散均匀分布生成随机样本。
exponential_like([数据, lam, 输出, 名称]) 它根据输入数组形状从指数分布生成随机样本。
gamma_like([数据、阿尔法、贝塔、输出、名称]) 它根据输入数组形状从伽玛分布生成随机样本。
广义负二项式([数据,...]) 它根据输入数组形状从广义负二项分布生成随机样本。
negative_binomial_like([数据, k, p, 输出, 名称]) 它根据输入数组形状从负二项式分布生成随机样本。
Normal_like([数据、位置、比例、输出、名称]) 它根据输入数组形状从正态(高斯)分布生成随机样本。
poisson_like([数据, lam, 输出, 名称]) 它根据输入数组形状从泊松分布生成随机样本。
uniform_like([数据、低、高、输出、名称]) 它根据输入数组形状从均匀分布生成随机样本。

实施示例

在下面的示例中,我们将使用 shuffle() 函数随机打乱元素。它将沿第一个轴打乱数组。

data = mx.nd.array([[0, 1, 2], [3, 4, 5], [6, 7, 8],[9,10,11]])
x = mx.sym.Variable('x')
y = mx.sym.random.shuffle(x)
y.eval(x=data)

输出

您将看到以下输出:

[
[[ 9. 10. 11.]
[ 0. 1. 2.]
[ 6. 7. 8.]
[ 3. 4. 5.]]
<NDArray 4x3 @cpu(0)>]

例子

y.eval(x=data)

输出

当您执行上述代码时,您应该看到以下输出 -

[
[[ 6. 7. 8.]
[ 0. 1. 2.]
[ 3. 4. 5.]
[ 9. 10. 11.]]
<NDArray 4x3 @cpu(0)>]

在下面的示例中,我们将从广义负二项分布中抽取随机样本。为此,将使用函数Generalized_ Negative_binomial()

mx.sym.random.generalized_negative_binomial(10, 0.1)

输出

输出如下 -

<Symbol _random_generalized_negative_binomial0>

符号.稀疏

稀疏符号 API 在 mxnet.symbol.sparse 包中定义。顾名思义,它提供稀疏神经网络图和 CPU 上的自动微分。

函数及其参数

以下是mxnet.symbol.sparse API涵盖的一些重要函数(包括符号创建例程、符号操作例程、数学函数、三角函数、双曲函数、Reduce 函数、舍入、幂、神经网络)及其参数-

功能及其参数 定义
ElementWiseSum(*args, **kwargs) 该函数将按元素添加所有输入参数。例如,