Apache Mxnet 简明教程

Apache MXNet - Python API ndarray

本章介绍了 Apache MXNet 中提供的 ndarray 库。

Mxnet.ndarray

Apache MXNet 的 NDArray 库为所有数学计算定义了核心 DS(数据结构)。NDArray 的两个基本工作如下 −

  1. 它支持在各种硬件配置上快速执行。

  2. 它自动将多个操作并行化到可用硬件上。

下面给出的示例展示了如何使用常规 Python 列表通过 1-D 和 2-D“数组”创建 NDArray −

import mxnet as mx
from mxnet import nd

x = nd.array([1,2,3,4,5,6,7,8,9,10])
print(x)

Output

输出如下:

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

Example

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)

Output

生成以下输出:

[[ 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 的类、函数和参数。

Classes

下表包括 MXNet 的 ndarray API 的类 −

Class

Definition

CachedOp(sym[, flags])

用于缓存的运算符句柄。

NDArray(handle[, writable])

用作表示固定大小项的多维、同质数组的数组对象。

Functions and their parameters

以下是一些由 mxnet.ndarray API 涵盖的重要函数及其参数 −

Function & its Parameters

Definition

Activation([data, act_type, out, name])

它将激活函数逐元素应用于输入中。支持 relu、sigmoid、tanh、softrelu、softsign 激活函数。

BatchNorm ([data, gamma, beta, moving_mean, …])

用于批归一化。此函数通过均值和方差对数据批执行归一化。它应用缩放 gamma 和偏移 beta。

BilinearSampler([data, grid, cudnn_off, …])

此函数对输入特征映射应用双线性采样。实际上它是“空间转换网络”的关键。如果您熟悉 OpenCV 中的重映射函数,此函数的使用与此非常相似。唯一不同之处在于它有反向通过。

BlockGrad([data, out, name])

根据名称指定,此函数停止渐变计算。它基本上阻止输入的累积梯度通过反向流过该运算符。

cast([data, dtype, out, name])

此函数将把输入的所有元素转换为新类型。

Implementation Examples

在下面的示例中,我们将使用函数 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)

Output

执行以上代码后,您应该看到以下输出:

[[[[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)

Output

输出如下 −

[[[[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')

Output

执行后,您将收到以下输出:

[ 44 10 15 255 254]
<NDArray 5 @cpu(0)>

ndarray.contrib

Contrib NDArray API 在 ndarray.contrib 包中定义。它通常为新特性提供许多有用的实验性 API。此 API 作为社区尝试新特性的场所。此功能的贡献者也将获得反馈。

Functions and their parameters

以下是 mxnet.ndarray.contrib API 涉及的一些重要函数及其参数 -

Function & its Parameters

Definition

rand_zipfian(true_classes, num_sampled, …)

此函数从近似的 Zipfian 分布中提取随机样本。此函数的基本分布是 Zipfian 分布。此函数随机抽取 num_sampled 候选者,并且 sampled_candidates 的元素从上面给出的基本分布中提取。

foreach(body, data, init_states)

顾名思义,此函数在维度 0 中通过用户定义的 NDArrays 计算来运行一个 for 循环。此函数模拟一个 for 循环,循环体包含该 for 循环迭代的计算。

while_loop(cond, func, loop_vars[, …])

顾名思义,此函数通过用户定义的计算和循环条件来运行一个 while 循环。此函数模拟一个 while 循环,如果条件得到满足,它会从容地执行自定义计算。

cond(pred, then_func, else_func)

顾名思义,此函数使用用户定义的条件和计算运行一个 if-then-else。此函数模拟一个类似 if 的分支,根据指定条件选择执行两个自定义计算之一。

isinf(data)

此函数执行逐元素检查,以确定 NDArray 是否包含无穷大的元素。

getnnz([data, axis, out, name])

此函数为我们提供稀疏张量的存储值数量。它还包括显式零。它仅支持 CPU 上的 CSR 矩阵。

requantize([data, min_range, max_range, …])

此函数对给定的数据进行重新量化,此数据以 int32 和相应的阈值量化,然后使用在运行时计算出的或从校准中获得的最小值和最大值阈值将其量化为 int8。

Implementation Examples

在下面的示例中,我们将使用 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

Output

您将看到以下输出 −

[0 0 1]
<NDArray 3 @cpu(0)>

Example

exp_count_true

Output

输出如下:

[0.53624076]
<NDArray 1 @cpu(0)>

Example

exp_count_sample

Output

这会生成以下输出:

[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

Output

输出如下所示−

[
[[       1]
 [      2]
 [      4]
 [      7]
 [     11]
 [     16]
 [     22]
 [     29]
 [3152434450384]
 [     257]]
<NDArray 10x1 @cpu(0)>]

Example

States

Output

生成以下输出:

[
[8]
<NDArray 1 @cpu(0)>,
[29]
<NDArray 1 @cpu(0)>]

ndarray.image

Image NDArray API 在 ndarray.image 包中进行定义。正如名称所示,它通常用于图像及其特征。

Functions and their parameters

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

Function & its Parameters

Definition

adjust_lighting([data, alpha, out, name])

正如名称所示,此函数调节输入的照明级别。它遵循 AlexNet 风格。

crop ([data, x, y, width, height, out, name])

在此函数的帮助下,我们可以将形状为 (H x W x C) 或 (N x H x W x C) 的图像 NDArray 裁剪到用户给定的尺寸。

normalize ([data, mean, std, out, name])

它将使用 meanstandard deviation(SD) 标准化形状为 (C x H x W) 或 (N x C x H x W) 的张量。

random_crop([data, xrange, yrange, width, …])

类似于 crop(),它会随机裁剪形状为 (H x W x C) 或 (N x H x W x C) 的图像 NDArray 到用户给定的尺寸。如果 src 小于尺寸,它会对结果进行上采样。

random_lighting([data, alpha_std, out, name])

正如名称所示,此函数随机添加 PCA 噪声。它也遵循 AlexNet 风格。

random_resized_crop([data, xrange, yrange, …])

它还随机裁剪形状为 (H x W x C) 或 (N x H x W x C) 的图像 NDArray 到给定的尺寸。如果 src 小于尺寸,它会对结果进行上采样。它同时会随机化区域和纵横比。

resize ([data, size, keep_ratio, interp, …])

正如名称所示,此函数将形状为 (H x W x C) 或 (N x H x W x C) 的图像 NDArray 调整到用户给定的尺寸。

to_tensor([data, out, name])

它将值在 [0, 255] 范围内的形状为 (H x W x C) 或 (N x H x W x C) 的图像 NDArray 转换为值在 [0, 1] 范围内的形状为 (C x H x W) 或 (N x C x H x W) 的张量 NDArray。

Implementation Examples

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

import numpy as np
img = mx.nd.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8)
mx.nd.image.to_tensor(img)

Output

您将看到以下输出 −

[[[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)>

Example

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

mx.nd.image.to_tensor(img)

Output

运行代码后,你将看到以下输出 −

[[[[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)>

在下面的示例中,我们将使用函数 normalize 使用 meanstandard deviation(SD) 标准化形状为 (C x H x W) 或 (N x C x H x W) 的张量。

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

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

Output

生成以下输出:

[[[ 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)>

Example

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

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

Output

执行以上代码时,应该看到以下输出 −

[[[[ 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

Random NDArray API 在 ndarray.random 包中定义。顾名思义,它是 MXNet 的随机分布生成器 NDArray API。

Functions and their parameters

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

Function and its Parameters

Definition

uniform([low, high, shape, dtype, ctx, out])

它从均匀分布中生成随机样本。

normal([loc, scale, shape, dtype, ctx, out])

它从正态(高斯)分布中生成随机样本。

randn(*shape, **kwargs)

它从正态(高斯)分布中生成随机样本。

exponential([scale, shape, dtype, ctx, out])

它从指数分布中生成样本。

gamma([alpha, beta, shape, dtype, ctx, out])

它从伽马分布中生成随机样本。

multinomial(data[, shape, get_prob, out, dtype])

它从多个多项分布中生成并发采样。

negative_binomial([k, p, shape, dtype, ctx, out])

它从负二项分布中生成随机样本。

generalized_negative_binomial([mu, alpha, …])

它从广义负二项分布中生成随机样本。

shuffle(data, **kwargs)

它随机洗牌元素。

randint(low, high[, shape, dtype, ctx, out])

它从离散均匀分布中生成随机样本。

exponential_like([data, lam, out, name])

它根据输入数组形状从指数分布中生成随机样本。

gamma_like([数据,阿尔法,贝塔,输出,名称])

根据输入数组形状从伽马分布生成随机样本。

generalized_negative_binomial_like([data, …])

根据输入数组形状从广义负二项分布生成随机样本。

negative_binomial_like([数据,k,p,输出,名称])

根据输入数组形状从负二项分布生成随机样本。

normal_like([数据,位置,比例,输出,名称])

根据输入数组形状从正态(高斯)分布生成随机样本。

poisson_like([data, lam, out, name])

根据输入数组形状从泊松分布生成随机样本。

uniform_like([数据,最低,最高,输出,名称])

根据输入数组形状从均匀分布生成随机样本。

Implementation Examples

在以下示例中,我们将从均匀分布中绘制随机样本。这将使用函数 uniform()

mx.nd.random.uniform(0, 1)

Output

输出如下:

[0.12381998]
<NDArray 1 @cpu(0)>

Example

mx.nd.random.uniform(-1, 1, shape=(2,))

Output

输出如下 −

[0.558102 0.69601643]
<NDArray 2 @cpu(0)>

Example

low = mx.nd.array([1,2,3])
high = mx.nd.array([2,3,4])
mx.nd.random.uniform(low, high, shape=2)

Output

您将看到以下输出 −

[[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)

Output

执行以上代码时,应该看到以下输出 −

[1.]
<NDArray 1 @cpu(0)>

Example

mx.nd.random.generalized_negative_binomial(10, 0.5, shape=(2,))

Output

输出与此一同给出 −

[16. 23.]
<NDArray 2 @cpu(0)>

Example

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)

Output

以下是代码的输出 −

[[0. 0.]
 [4. 1.]
 [9. 3.]]
<NDArray 3x2 @cpu(0)>

ndarray.utils

实用 NDArray API 在 ndarray.utils 包中定义。顾名思义,它为 NDArray 和 BaseSparseNDArray 提供实用函数。

Functions and their parameters

以下是由 mxnet.ndarray.utils API 涵盖的部分重要函数及其参数 -

Function and its Parameters

Definition

zeros(shape[, ctx, dtype, stype])

此函数将返回一个给定形状和类型的、填充为零的新数组。

empty(shape[, ctx, dtype, stype])

它将返回一个给定形状和类型的新数组,而不初始化条目。

array(source_array[, ctx, dtype])

顾名思义,此函数将从公开数组界面的任意对象创建数组。

load(fname)

它将从文件加载数组。

load_frombuffer(buf)

顾名思义,此函数将从缓冲区加载数组字典或列表

save(fname, data)

将数组或字符串词典列表保存到文件中的这个函数。

Implementation Examples

在下面的例子中,我们将返回一个以零填充的新数组,该数组具有给定的形状和类型。为此,我们将使用函数 [s0]。

mx.nd.zeros((1,2), mx.cpu(), stype='csr')

Output

生成以下输出:

<CSRNDArray 1x2 @cpu(0)>

Example

mx.nd.zeros((1,2), mx.cpu(), 'float16', stype='row_sparse').asnumpy()

Output

您将收到以下输出 −

array([[0., 0.]], dtype=float16)

在下面的例子中,我们将保存一个数组列表和一个字符串词典。为此,我们将使用函数 [s1]。

Example

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')

Output

执行后,您将收到以下输出:

[
[[0. 0. 0.]
[0. 0. 0.]]
<NDArray 2x3 @cpu(0)>,
[[1. 1. 1. 1.]]
<NDArray 1x4 @cpu(0)>]

Example

mx.nd.load('my_dict')

Output

输出如下所示−

{'x':
[[0. 0. 0.]
[0. 0. 0.]]
<NDArray 2x3 @cpu(0)>, 'y':
[[1. 1. 1. 1.]]
<NDArray 1x4 @cpu(0)>}