Apache MXNet - Python API ndarray

В этой главе объясняется библиотека ndarray, доступная в Apache MXNet.

Mxnet.ndarray

Библиотека NDArray Apache MXNet определяет основные DS (структуры данных) для всех математических вычислений. Две основные задачи NDArray заключаются в следующем:

  • Он поддерживает быстрое выполнение в широком диапазоне аппаратных конфигураций.

  • Он автоматически распараллеливает несколько операций на доступном оборудовании.

В приведенном ниже примере показано, как можно создать NDArray, используя 1-D и 2-D «массив» из обычного списка Python.

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

Теперь давайте подробно обсудим классы, функции и параметры ndarray API MXNet.

Классы

Следующая таблица состоит из классов ndarray API MXNet -

Класс Определение
CachedOp (sym [, флаги]) Он используется для кэшированного дескриптора оператора.
NDArray (дескриптор [, доступен для записи]) Он используется как объект массива, представляющий многомерный однородный массив элементов фиксированного размера.

Функции и их параметры

Ниже приведены некоторые из важных функций и их параметров, охватываемых API mxnet.ndarray.

Функция и ее параметры Определение
Activation([данные, тип_ действия, выход, имя]) Он применяет функцию активации к входу поэтапно. Он поддерживает функции активации relu, sigmoid, tanh, softrelu, softsign.
BatchNorm([данные, гамма, бета, moving_mean,…]) Он используется для пакетной нормализации. Эта функция нормализует пакет данных по среднему значению и дисперсии. Он применяет гамму шкалы и бета смещения.
BilinearSampler([данные, сетка, cudnn_off,…])

Эта функция применяет билинейную выборку к входной карте объектов. Фактически это ключ «Пространственных трансформаторных сетей».

Если вы знакомы с функцией переназначения в OpenCV, использование этой функции очень похоже на это. Единственное отличие в том, что у него есть обратный проход.

BlockGrad ([данные, выход, имя]) Как указано в названии, эта функция останавливает вычисление градиента. Это в основном предотвращает прохождение накопленного градиента входных данных через этого оператора в обратном направлении.
cast ([данные, dtype, out, name]) Эта функция приведет все элементы ввода к новому типу.

Примеры реализации

В приведенном ниже примере мы будем использовать функцию 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

API Contrib NDArray определен в пакете ndarray.contrib. Обычно он предоставляет множество полезных экспериментальных API для новых функций. Этот API работает как место для сообщества, где они могут опробовать новые функции. Автор функции также получит обратную связь.

Функции и их параметры

Ниже приведены некоторые важные функции и их параметры, охватываемые mxnet.ndarray.contrib API -

Функция и ее параметры Определение
rand_zipfian(true_classes, num_sampled,…) Эта функция извлекает случайные выборки из приблизительно распределения Ципфа. Базовое распределение этой функции - это распределение Ципфа. Эта функция произвольно выбирает num_sampled кандидатов, а элементы sampled_candidates выбираются из базового распределения, приведенного выше.
foreach(тело, данные, init_states) Как следует из названия, эта функция запускает цикл for с определяемыми пользователем вычислением над NDArrays для измерения 0. Эта функция имитирует цикл for, а в теле есть вычисление для итерации цикла for.
while_loop (cond, func, loop_vars [,…]) Как следует из названия, эта функция запускает цикл while с вычислением, определяемым пользователем, и условием цикла. Эта функция имитирует цикл while, который грамотно выполняет индивидуальные вычисления, если условие выполнено.
cond(пред, then_func, else_func) Как следует из названия, эта функция запускает if-then-else, используя определяемые пользователем условия и вычисления. Эта функция имитирует подобную if ветвь, которая выбирает выполнение одного из двух настраиваемых вычислений в соответствии с указанным условием.
isinf(данные) Эта функция выполняет поэлементную проверку, чтобы определить, содержит ли NDArray бесконечный элемент или нет.
getnnz([данные, ось, выход, имя]) Эта функция дает нам количество сохраненных значений для разреженного тензора. Он также включает явные нули. Он поддерживает только матрицу CSR на CPU.
перепроверить ([данные, минимальный_диапазон, максимальный_диапазон,…]) Эта функция запрашивает данные, которые квантованы в 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

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

API изображений NDArray определен в пакете ndarray.image. Как следует из названия, он обычно используется для изображений и их функций.

Функции и их параметры

Ниже приведены некоторые из важных функций и их параметры, охватываемые mxnet.ndarray.image API-

Функция и ее параметры Определение
adjust_lighting([данные, альфа, выход, имя]) Как следует из названия, эта функция регулирует уровень освещения входа. Он следует стилю AlexNet.
crop([данные, x, y, ширина, высота, выход, имя]) С помощью этой функции мы можем обрезать NDArray изображения формы (В x Ш x В) или (N x В x Ш x C) до размера, заданного пользователем.
normalize([данные, среднее, стандартное, выходное, имя]) Он нормализует тензор формы (C x H x W) или (N x C x H x W) с mean а также standard deviation(SD).
random_crop ([данные, xrange, yrange, width,…]) Подобно функции crop (), она произвольно обрезает NDArray изображения формы (В x Ш x В) или (N x В x Ш x C) до размера, заданного пользователем. Результат будет повышен, если src меньше размера.
random_lighting([данные, alpha_std, out, name]) Как следует из названия, эта функция случайным образом добавляет шум PCA. Он также следует стилю AlexNet.
random_resized_crop([данные, xrange, yrange,…]) Он также обрезает изображение произвольно NDArray формы (В x Ш x В) или (N x В x Ш x В) до заданного размера. Результат будет повышен, если src меньше размера. Это также рандомизирует площадь и соотношение сторон.
resize([данные, размер, keep_ratio, interp,…]) Как следует из названия, эта функция изменит размер NDArray изображения формы (В x Ш x В) или (N x В x Ш x C) до размера, заданного пользователем.
to_tensor([данные, выход, имя]) Он преобразует NDArray изображения формы (В x Ш 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 для преобразования NDArray изображения формы (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].

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 для нормализации тензора формы (C x H x W) или (N x C x H x W) с mean а также standard deviation(SD).

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

API Random NDArray определен в пакете ndarray.random. Как следует из названия, это генератор случайного распределения NDArray API MXNet.

Функции и их параметры

Ниже приведены некоторые важные функции и их параметры, охватываемые mxnet.ndarray.random API -

Функция и ее параметры Определение
униформа ([низкий, высокий, форма, dtype, ctx, out]) Он генерирует случайные выборки из равномерного распределения.
нормальный ([loc, scale, shape, dtype, ctx, out]) Он генерирует случайные выборки из нормального (гауссовского) распределения.
randn (* форма, ** kwargs) Он генерирует случайные выборки из нормального (гауссовского) распределения.
экспоненциальный ([масштаб, форма, dtype, ctx, out]) Он генерирует выборки из экспоненциального распределения.
гамма ([альфа, бета, форма, dtype, ctx, out]) Он генерирует случайные выборки из гамма-распределения.
мультиномиальный (данные [, форма, get_prob, out, dtype]) Он генерирует одновременную выборку из нескольких полиномиальных распределений.
negative_binomial ([k, p, shape, dtype, ctx, out]) Он генерирует случайные выборки из отрицательного биномиального распределения.
generalized_negative_binomial ([mu, alpha,…]) Он генерирует случайные выборки из обобщенного отрицательного биномиального распределения.
перемешать (данные, ** kwargs) Он перемешивает элементы случайным образом.
randint (низкий, высокий [, форма, dtype, ctx, out]) Он генерирует случайные выборки из дискретного равномерного распределения.
exponential_like ([данные, лам, выход, имя]) Он генерирует случайные выборки из экспоненциального распределения в соответствии с формой входного массива.
gamma_like ([данные, альфа, бета, выход, имя]) Он генерирует случайные выборки из гамма-распределения в соответствии с формой входного массива.
generalized_negative_binomial_like ([данные,…]) Он генерирует случайные выборки из обобщенного отрицательного биномиального распределения в соответствии с формой входного массива.
negative_binomial_like ([данные, k, p, out, name]) Он генерирует случайные выборки из отрицательного биномиального распределения в соответствии с формой входного массива.
normal_like ([данные, расположение, масштаб, размер, имя]) Он генерирует случайные выборки из нормального (гауссовского) распределения в соответствии с формой входного массива.
poisson_like ([данные, лам, выход, имя]) Он генерирует случайные выборки из распределения Пуассона в соответствии с формой входного массива.
uniform_like ([данные, низкий, высокий, выход, имя]) Он генерирует случайные выборки из равномерного распределения в соответствии с формой входного массива.

Примеры реализации

В приведенном ниже примере мы будем брать случайные выборки из равномерного распределения. Для этого будет использоваться функция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.

Функции и их параметры

Ниже приведены некоторые важные функции и их параметры, охватываемые mxnet.ndarray.utils API -

Функция и ее параметры Определение
нули (форма [, ctx, dtype, stype]) Эта функция вернет новый массив заданной формы и типа, заполненный нулями.
пустой (shape [, ctx, dtype, stype]) Он вернет новый массив заданной формы и типа без инициализации записей.
массив (исходный_массив [, ctx, dtype]) Как следует из названия, эта функция создаст массив из любого объекта, предоставляющего интерфейс массива.
загрузка (имя_файлы) Он загрузит массив из файла.
load_frombuffer (buf) Как следует из названия, эта функция загрузит словарь или список массивов из буфера.
сохранить (имя, данные) Эта функция сохранит в файл список массивов или словарный запас str-> array.

Примеры реализации

В приведенном ниже примере мы собираемся вернуть новый массив заданной формы и типа, заполненный нулями. Для этого мы будем использовать функциюzeros().

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)

В приведенном ниже примере мы собираемся сохранить список массивов и словарь строк. Для этого мы будем использовать функциюsave().

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