- 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 - 讨论
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) | 该函数将按元素添加所有输入参数。例如, |