- 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 ndarray
本章介绍 Apache MXNet 中可用的 ndarray 库。
MXnet.ndarray
Apache MXNet 的 NDArray 库定义了所有数学计算的核心 DS(数据结构)。NDArray 的两个基本工作如下 -
它支持在各种硬件配置上快速执行。
它会自动在可用硬件上并行执行多个操作。
下面给出的示例显示了如何使用常规 Python 列表中的一维和二维“数组”创建 NDArray -
import mxnet as mx from mxnet import nd x = nd.array([1,2,3,4,5,6,7,8,9,10]) print(x)
输出
输出如下:
[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.] <NDArray 10 @cpu(0)>
例子
y = nd.array([[1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10], [1,2,3,4,5,6,7,8,9,10]]) print(y)
输出
这会产生以下输出 -
[[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.] [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.] [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]] <NDArray 3x10 @cpu(0)>
现在让我们详细讨论MXNet的ndarray API的类、函数和参数。
课程
下表包含 MXNet 的 ndarray API 类 -
班级 | 定义 |
---|---|
CachedOp(符号[, 标志]) | 它用于缓存操作符句柄。 |
NDArray(句柄[,可写]) | 它用作表示固定大小项的多维同构数组的数组对象。 |
函数及其参数
以下是 mxnet.ndarray API 涵盖的一些重要函数及其参数 -
功能及参数 | 定义 |
---|---|
激活([数据,act_type,输出,名称]) | 它将激活函数逐元素应用于输入。它支持relu、sigmoid、tanh、softrelu、softsign激活函数。 |
BatchNorm ([数据, gamma, beta, moving_mean, …]) | 它用于批量归一化。该函数通过均值和方差对数据批次进行标准化。它应用缩放伽玛和偏移贝塔。 |
双线性采样器([数据,网格,cudnn_off,...]) |
该函数对输入特征图应用双线性采样。实际上它是“空间变换网络”的关键。 如果您熟悉OpenCV中的remap函数,那么该函数的用法与此非常相似。唯一的区别是它有向后传递。 |
BlockGrad([数据, 输出, 名称]) | 正如名称所示,该函数停止梯度计算。它基本上阻止了输入的累积梯度向后流过该运算符。 |
强制转换([数据,数据类型,输出,名称]) | 此函数会将输入的所有元素转换为新类型。 |
实施示例
在下面的示例中,我们将使用函数 BilinierSampler() 将数据缩小两次并将数据水平移动 -1 像素 -
import mxnet as mx from mxnet import nd data = nd.array([[[[2, 5, 3, 6], [1, 8, 7, 9], [0, 4, 1, 8], [2, 0, 3, 4]]]]) affine_matrix = nd.array([[2, 0, 0], [0, 2, 0]]) affine_matrix = nd.reshape(affine_matrix, shape=(1, 6)) grid = nd.GridGenerator(data=affine_matrix, transform_type='affine', target_shape=(4, 4)) output = nd.BilinearSampler(data, grid)
输出
当您执行上述代码时,您应该看到以下输出:
[[[[0. 0. 0. 0. ] [0. 4.0000005 6.25 0. ] [0. 1.5 4. 0. ] [0. 0. 0. 0. ]]]] <NDArray 1x1x4x4 @cpu(0)>
上面的输出显示数据缩小了两次。
将数据移位 -1 像素的示例如下 -
import mxnet as mx from mxnet import nd data = nd.array([[[[2, 5, 3, 6], [1, 8, 7, 9], [0, 4, 1, 8], [2, 0, 3, 4]]]]) warp_matrix = nd.array([[[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]]) grid = nd.GridGenerator(data=warp_matrix, transform_type='warp') output = nd.BilinearSampler(data, grid)
输出
输出如下:
[[[[5. 3. 6. 0.] [8. 7. 9. 0.] [4. 1. 8. 0.] [0. 3. 4. 0.]]]] <NDArray 1x1x4x4 @cpu(0)>
同样,以下示例显示了cast()函数的使用 -
nd.cast(nd.array([300, 10.1, 15.4, -1, -2]), dtype='uint8')
输出
执行后,您将收到以下输出 -
[ 44 10 15 255 254] <NDArray 5 @cpu(0)>
ndarray.contrib
Contrib NDArray API 在 ndarray.contrib 包中定义。它通常为新功能提供许多有用的实验性 API。该 API 为社区提供了一个可以尝试新功能的地方。功能贡献者也会得到反馈。
函数及其参数
以下是mxnet.ndarray.contrib API涵盖的一些重要函数及其参数-
功能及参数 | 定义 |
---|---|
rand_zipfian (true_classes, num_sampled, …) | 该函数从近似 Zipfian 分布中抽取随机样本。该函数的基本分布是 Zipfian 分布。该函数对 num_sampled 候选者进行随机采样,sampled_candidates 的元素是从上面给出的基本分布中抽取的。 |
foreach(正文、数据、init_states) | 顾名思义,该函数在维度 0 上的 NDArray 上运行一个带有用户定义计算的 for 循环。该函数模拟一个 for 循环,并且主体具有 for 循环迭代的计算。 |
while_loop(cond, func, Loop_vars[, …]) | 顾名思义,该函数使用用户定义的计算和循环条件运行 while 循环。该函数模拟一个 while 循环,如果满足条件,该循环就会按字面意思进行定制计算。 |
cond (pred, then_func, else_func) | 顾名思义,该函数使用用户定义的条件和计算运行 if-then-else。该函数模拟一个类似 if 的分支,该分支根据指定的条件选择执行两个自定义计算之一。 |
isinf(数据) | 此函数执行逐元素检查以确定 NDArray 是否包含无限元素。 |
getnnz ([数据、轴、输出、名称]) | 该函数为我们提供了稀疏张量的存储值的数量。它还包括显式零。它仅支持 CPU 上的 CSR 矩阵。 |
重新量化([数据,最小范围,最大范围,...]) | 该函数使用在运行时计算或通过校准计算的最小和最大阈值,将 int32 和相应阈值中量化的给定数据重新量化为 int8。 |
实施示例
在下面的示例中,我们将使用函数 rand_zipfian 从近似 Zipfian 分布中抽取随机样本 -
import mxnet as mx from mxnet import nd trueclass = mx.nd.array([2]) samples, exp_count_true, exp_count_sample = mx.nd.contrib.rand_zipfian(trueclass, 3, 4) samples
输出
您将看到以下输出 -
[0 0 1] <NDArray 3 @cpu(0)>
例子
exp_count_true
输出
输出如下:
[0.53624076] <NDArray 1 @cpu(0)>
例子
exp_count_sample
输出
这会产生以下输出:
[1.29202967 1.29202967 0.75578891] <NDArray 3 @cpu(0)>
在下面的示例中,我们将使用函数while_loop运行 while 循环以进行用户定义的计算和循环条件:
cond = lambda i, s: i <= 7 func = lambda i, s: ([i + s], [i + 1, s + i]) loop_var = (mx.nd.array([0], dtype="int64"), mx.nd.array([1], dtype="int64")) outputs, states = mx.nd.contrib.while_loop(cond, func, loop_vars, max_iterations=10) outputs
输出
输出如下所示 -
[ [[ 1] [ 2] [ 4] [ 7] [ 11] [ 16] [ 22] [ 29] [3152434450384] [ 257]] <NDArray 10x1 @cpu(0)>]
例子
States
输出
这会产生以下输出 -
[ [8] <NDArray 1 @cpu(0)>, [29] <NDArray 1 @cpu(0)>]
ndarray.image
图像 NDArray API 在 ndarray.image 包中定义。顾名思义,它通常用于图像及其特征。
函数及其参数
以下是mxnet.ndarray.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 小于大小,它将对结果进行上采样。 |
random_lighting([数据,alpha_std,输出,名称]) | 顾名思义,该函数随机添加 PCA 噪声。它还遵循 AlexNet 风格。 |
random_resized_crop([数据,x范围,y范围,...]) | 它还将形状 (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.nd.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8) mx.nd.image.to_tensor(img)
输出
您将看到以下输出 -
[[[0.972549 0.5058824 ] [0.6039216 0.01960784] [0.28235295 0.35686275] [0.11764706 0.8784314 ]] [[0.8745098 0.9764706 ] [0.4509804 0.03529412] [0.9764706 0.29411766] [0.6862745 0.4117647 ]] [[0.46666667 0.05490196] [0.7372549 0.4392157 ] [0.11764706 0.47843137] [0.31764707 0.91764706]]] <NDArray 3x4x2 @cpu(0)>
例子
img = mx.nd.random.uniform(0, 255, (2, 4, 2, 3)).astype(dtype=np.uint8) mx.nd.image.to_tensor(img)
输出
当您运行代码时,您将看到以下输出 -
[[[[0.0627451 0.5647059 ] [0.2627451 0.9137255 ] [0.57254905 0.27450982] [0.6666667 0.64705884]] [[0.21568628 0.5647059 ] [0.5058824 0.09019608] [0.08235294 0.31764707] [0.8392157 0.7137255 ]] [[0.6901961 0.8627451 ] [0.52156866 0.91764706] [0.9254902 0.00784314] [0.12941177 0.8392157 ]]] [[[0.28627452 0.39607844] [0.01960784 0.36862746] [0.6745098 0.7019608 ] [0.9607843 0.7529412 ]] [[0.2627451 0.58431375] [0.16470589 0.00392157] [0.5686275 0.73333335] [0.43137255 0.57254905]] [[0.18039216 0.54901963] [0.827451 0.14509805] [0.26666668 0.28627452] [0.24705882 0.39607844]]]] <NDArgt;ray 2x3x4x2 @cpu(0)>
在下面的示例中,我们将使用函数标准化来标准化形状为 (C x H x W) 或 (N x C x H x W) 的张量,其平均值和标准差 (SD)。
img = mx.nd.random.uniform(0, 1, (3, 4, 2)) mx.nd.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))
输出
这会产生以下输出 -
[[[ 0.29391178 0.3218054 ] [ 0.23084386 0.19615503] [ 0.24175143 0.21988946] [ 0.16710812 0.1777354 ]] [[-0.02195817 -0.3847335 ] [-0.17800489 -0.30256534] [-0.28807247 -0.19059572] [-0.19680339 -0.26256624]] [[-1.9808068 -1.5298678 ] [-1.6984252 -1.2839255 ] [-1.3398265 -1.712009 ] [-1.7099224 -1.6165378 ]]] <NDArray 3x4x2 @cpu(0)>
例子
img = mx.nd.random.uniform(0, 1, (2, 3, 4, 2)) mx.nd.image.normalize(img, mean=(0, 1, 2), std=(3, 2, 1))
输出
当您执行上述代码时,您应该看到以下输出 -
[[[[ 2.0600514e-01 2.4972327e-01] [ 1.4292289e-01 2.9281738e-01] [ 4.5158025e-02 3.4287784e-02] [ 9.9427439e-02 3.0791296e-02]] [[-2.1501756e-01 -3.2297665e-01] [-2.0456362e-01 -2.2409186e-01] [-2.1283737e-01 -4.8318747e-01] [-1.7339960e-01 -1.5519112e-02]] [[-1.3478968e+00 -1.6790028e+00] [-1.5685816e+00 -1.7787373e+00] [-1.1034534e+00 -1.8587360e+00] [-1.6324382e+00 -1.9027401e+00]]] [[[ 1.4528830e-01 3.2801408e-01] [ 2.9730779e-01 8.6780310e-02] [ 2.6873133e-01 1.7900752e-01] [ 2.3462953e-01 1.4930873e-01]] [[-4.4988656e-01 -4.5021546e-01] [-4.0258706e-02 -3.2384416e-01] [-1.4287934e-01 -2.6537544e-01] [-5.7649612e-04 -7.9429924e-02]] [[-1.8505517e+00 -1.0953522e+00] [-1.1318740e+00 -1.9624406e+00] [-1.8375070e+00 -1.4916846e+00] [-1.3844404e+00 -1.8331525e+00]]]] <NDArray 2x3x4x2 @cpu(0)>
ndarray.随机数
Random NDArray API 在 ndarray.random 包中定义。顾名思义,它是 MXNet 的随机分布生成器 NDArray API。
函数及其参数
以下是mxnet.ndarray.random API涵盖的一些重要函数及其参数-
功能及其参数 | 定义 |
---|---|
均匀([低,高,形状,dtype,ctx,out]) | 它从均匀分布中生成随机样本。 |
正常([loc,比例,形状,dtype,ctx,out]) | 它从正态(高斯)分布生成随机样本。 |
randn(*形状,**kwargs) | 它从正态(高斯)分布生成随机样本。 |
指数([尺度,形状,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([数据、低、高、输出、名称]) | 它根据输入数组形状从均匀分布生成随机样本。 |
实施示例
在下面的示例中,我们将从均匀分布中抽取随机样本。为此,将使用函数uniform()。
mx.nd.random.uniform(0, 1)
输出
输出如下 -
[0.12381998] <NDArray 1 @cpu(0)>
例子
mx.nd.random.uniform(-1, 1, shape=(2,))
输出
输出如下 -
[0.558102 0.69601643] <NDArray 2 @cpu(0)>
例子
low = mx.nd.array([1,2,3]) high = mx.nd.array([2,3,4]) mx.nd.random.uniform(low, high, shape=2)
输出
您将看到以下输出 -
[[1.8649333 1.8073189] [2.4113967 2.5691009] [3.1399727 3.4071832]] <NDArray 3x2 @cpu(0)>
在下面的示例中,我们将从广义负二项分布中抽取随机样本。为此,我们将使用函数Generalized_ Negative_binomial()。
mx.nd.random.generalized_negative_binomial(10, 0.5)
输出
当您执行上述代码时,您应该看到以下输出 -
[1.] <NDArray 1 @cpu(0)>
例子
mx.nd.random.generalized_negative_binomial(10, 0.5, shape=(2,))
输出
输出如下:
[16. 23.] <NDArray 2 @cpu(0)>
例子
mu = mx.nd.array([1,2,3]) alpha = mx.nd.array([0.2,0.4,0.6]) mx.nd.random.generalized_negative_binomial(mu, alpha, shape=2)
输出
下面给出的是代码的输出 -
[[0. 0.] [4. 1.] [9. 3.]] <NDArray 3x2 @cpu(0)>
ndarray.utils
实用程序 NDArray API 在 ndarray.utils 包中定义。顾名思义,它提供了 NDArray 和 BaseSparseNDArray 的实用函数。
函数及其参数
以下是mxnet.ndarray.utils API涵盖的一些重要函数及其参数-
功能及其参数 | 定义 |
---|---|
零(形状[,ctx,dtype,stype]) | 该函数将返回给定形状和类型的新数组,并用零填充。 |
空(形状[,ctx,dtype,stype]) | 它将返回给定形状和类型的新数组,而不初始化条目。 |
数组(源数组[,ctx,dtype]) | 顾名思义,该函数将从任何公开数组接口的对象创建一个数组。 |
加载(fname) | 它将从文件加载一个数组。 |
从缓冲区加载(buf) | 顾名思义,该函数将从缓冲区加载数组字典或列表 |
保存(文件名,数据) | 该函数会将数组列表或 str->array 的字典保存到文件中。 |
实施示例
在下面的示例中,我们将返回给定形状和类型的新数组,并用零填充。为此,我们将使用函数Zeros()。
mx.nd.zeros((1,2), mx.cpu(), stype='csr')
输出
这会产生以下输出 -
<CSRNDArray 1x2 @cpu(0)>
例子
mx.nd.zeros((1,2), mx.cpu(), 'float16', stype='row_sparse').asnumpy()
输出
您将收到以下输出 -
array([[0., 0.]], dtype=float16)
在下面的示例中,我们将保存一个数组列表和一个字符串字典。为此,我们将使用函数save()。
例子
x = mx.nd.zeros((2,3)) y = mx.nd.ones((1,4)) mx.nd.save('list', [x,y]) mx.nd.save('dict', {'x':x, 'y':y}) mx.nd.load('list')
输出
执行后,您将收到以下输出 -
[ [[0. 0. 0.] [0. 0. 0.]] <NDArray 2x3 @cpu(0)>, [[1. 1. 1. 1.]] <NDArray 1x4 @cpu(0)>]
例子
mx.nd.load('my_dict')
输出
输出如下所示 -
{'x': [[0. 0. 0.] [0. 0. 0.]] <NDArray 2x3 @cpu(0)>, 'y': [[1. 1. 1. 1.]] <NDArray 1x4 @cpu(0)>}