Apache MXNet - символ API Python

В этой главе мы узнаем об интерфейсе в MXNet, который называется символом.

Mxnet.ndarray

API символов Apache MXNet - это интерфейс для символьного программирования. В Symbol API используется следующее:

  • Вычислительные графики

  • Сниженное использование памяти

  • Оптимизация функции перед использованием

В приведенном ниже примере показано, как можно создать простое выражение с помощью MXNet Symbol API.

NDArray с использованием 1-D и 2-D "массива" из обычного списка Python -

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

Output

Вы увидите следующий вывод -

<Symbol _plus0>

Example

(x, y, z)

Output

Результат приведен ниже -

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

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

Классы

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

Класс Определение
Символ (ручка) Этот класс, а именно символ, является символическим графом Apache MXNet.

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

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

Функция и ее параметры Определение
Активация ([данные, act_type, out, name]) Он применяет функцию активации к входу поэтапно. Он поддерживаетrelu, sigmoid, tanh, softrelu, softsign функции активации.
BatchNorm ([данные, гамма, бета, moving_mean,…]) Он используется для пакетной нормализации. Эта функция нормализует пакет данных по среднему значению и дисперсии. Применяет шкалуgamma и смещение beta.
BilinearSampler ([данные, сетка, cudnn_off,…]) Эта функция применяет билинейную выборку к входной карте объектов. Фактически это ключ «Пространственных трансформаторных сетей». Если вы знакомы с функцией переназначения в OpenCV, использование этой функции очень похоже на это. Единственное отличие в том, что у него есть обратный проход.
BlockGrad ([данные, выход, имя]) Как указано в названии, эта функция останавливает вычисление градиента. Это в основном предотвращает прохождение накопленного градиента входных данных через этого оператора в обратном направлении.
cast ([данные, dtype, out, name]) Эта функция приведет все элементы ввода к новому типу.
Эта функция приведет все элементы ввода к новому типу. Эта функция, как указано в названии, возвращает новый символ заданной формы и типа, заполненный нулями.
единицы (shape [, dtype]) Эта функция, как указано имя, возвращает новый символ заданной формы и типа, заполненный единицами.
полный (shape, val [, dtype]) Эта функция, как указано в названии, возвращает новый массив заданной формы и типа, заполненный заданным значением. val.
arange (start [, stop, step, repeat,…]) Он вернет равномерно распределенные значения в заданном интервале. Значения генерируются в пределах полуоткрытого интервала [старт, стоп), что означает, что интервал включаетstart но исключает stop.
linspace (начало, остановка, число [, конечная точка, имя,…]) Он вернет числа с равными интервалами в пределах указанного интервала. Подобно функции организовать (), значения генерируются в пределах полуоткрытого интервала [старт, стоп), что означает, что интервал включаетstart но исключает stop.
гистограмма (a [, интервалы, диапазон]) Как следует из названия, эта функция будет вычислять гистограмму входных данных.
мощность (основание, опыт) Как следует из названия, эта функция будет возвращать поэлементный результат base элемент возведен в степень от expэлемент. Оба входа, то есть base и exp, могут быть либо Symbol, либо скалярными. Здесь учтите, что вещание запрещено. Ты можешь использоватьbroadcast_pow если вы хотите использовать функцию трансляции.
SoftmaxActivation ([данные, режим, имя, атрибут, выход]) Эта функция применяет ко входу активацию softmax. Он предназначен для внутренних слоев. Фактически он устарел, мы можем использоватьsoftmax() вместо.

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

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

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

Output

Вы увидите следующий вывод -

243

Example

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

Output

Это дает следующий результат -

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

Example

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

Output

Когда вы выполните приведенный выше код, вы должны увидеть следующий результат -

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

Example

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

Output

Вывод упомянут ниже -

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

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

Output

Вы увидите следующий вывод -

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

symbol.contrib

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

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

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

Функция и ее параметры Определение
rand_zipfian (true_classes, num_sampled,…) Эта функция извлекает случайные выборки из приблизительно распределения Ципфа. Базовое распределение этой функции - это распределение Ципфа. Эта функция произвольно выбирает num_sampled кандидатов, а элементы sampled_candidates выбираются из базового распределения, приведенного выше.
foreach (тело, данные, init_states) Как следует из названия, эта функция запускает цикл с пользовательскими вычислениями над NDArrays для измерения 0. Эта функция имитирует цикл for, а в теле есть вычисление для итерации цикла for.
while_loop (cond, func, loop_vars [,…]) Как следует из названия, эта функция запускает цикл while с вычислением, определяемым пользователем, и условием цикла. Эта функция имитирует цикл while, который грамотно выполняет индивидуальные вычисления, если условие выполнено.
cond (пред, then_func, else_func) Как следует из названия, эта функция запускает if-then-else, используя определяемые пользователем условия и вычисления. Эта функция имитирует подобную if ветвь, которая выбирает выполнение одного из двух настраиваемых вычислений в соответствии с указанным условием.
getnnz ([данные, ось, выход, имя]) Эта функция дает нам количество сохраненных значений для разреженного тензора. Он также включает явные нули. Он поддерживает только матрицу CSR на CPU.
перепроверить ([данные, минимальный_диапазон, максимальный_диапазон,…]) Эта функция повторно квантует данные, квантованные в int32 и соответствующие пороговые значения, в int8, используя минимальные и максимальные пороги, рассчитанные во время выполнения или на основе калибровки.
index_copy ([old_tensor, index_vector,…]) Эта функция копирует элементы new_tensor into the old_tensor by selecting the indices in the order given in index. The output of this operator will be a new tensor that contains the rest elements of old tensor and the copied elements of new 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()

Output

Вы увидите следующий вывод -

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

Example

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

Output

Вывод упомянут ниже -

array([0.57336551])

Example

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

Output

Вы увидите следующий вывод -

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)

Output

Результат представлен ниже:

[<Symbol _while_loop0>]

Example

Print(States)

Output

Это дает следующий результат -

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

Output

Когда вы выполните приведенный выше код, вы должны увидеть следующий результат -

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

символ. изображение

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

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

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

Функция и ее параметры Определение
Adjust_lighting ([данные, альфа, выход, имя]) Как следует из названия, эта функция регулирует уровень освещения входа. Он следует стилю AlexNet.
обрезка ([данные, 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 меньше, чем size.
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.sym.random.uniform(0, 255, (4, 2, 3)).astype(dtype=np.uint8)

mx.sym.image.to_tensor(img)

Output

Результат указан ниже -

<Symbol to_tensor4>

Example

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

mx.sym.image.to_tensor(img)

Output

Результат указан ниже:

<Symbol to_tensor5>

В приведенном ниже примере мы будем использовать функцию normalize () для нормализации тензора формы (C x H x W) или (N x C x H x W) с mean а также standard deviation(SD).

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

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

Output

Ниже приведен вывод кода -

<Symbol normalize0>

Example

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

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

Output

Результат показан ниже -

<Symbol normalize1>

символ. случайный

API случайных символов определен в пакете symbol.random. Как следует из названия, это генератор случайных распределений Symbol API MXNet.

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

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

Функция и ее параметры Определение
униформа ([низкий, высокий, форма, dtype, ctx, out]) Он генерирует случайные выборки из равномерного распределения.
нормальный ([loc, scale, shape, dtype, ctx, out]) Он генерирует случайные выборки из нормального (гауссовского) распределения.
randn (* форма, ** kwargs) Он генерирует случайные выборки из нормального (гауссовского) распределения.
пуассон ([lam, shape, dtype, ctx, out]) Он генерирует случайные выборки из распределения Пуассона.
экспоненциальный ([масштаб, форма, 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 ([данные, низкий, высокий, выход, имя]) Он генерирует случайные выборки из равномерного распределения в соответствии с формой входного массива.

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

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

Output

Вы увидите следующий результат:

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

Example

y.eval(x=data)

Output

Когда вы выполните приведенный выше код, вы должны увидеть следующий результат -

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

Output

Результат приведен ниже -

<Symbol _random_generalized_negative_binomial0>

символ. разреженный

API разреженных символов определен в пакете mxnet.symbol.sparse. Как следует из названия, он обеспечивает разреженные нейронные сетевые графы и автоматическую дифференциацию ЦП.

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

Ниже приведены некоторые из важных функций (включая процедуры создания символов, процедуры обработки символов, математические функции, тригонометрические функции, гиберболические функции, функции сокращения, округление, степени, нейронную сеть) и их параметры, охватываемые mxnet.symbol.sparse API -

Функция и ее параметры Определение
ElementWiseSum (* аргументы, ** kwargs) Эта функция добавит все входные аргументы поэлементно. Например, _ (1,2,… = 1 + 2 + ⋯ +). Здесь мы видим, что add_n потенциально более эффективен, чем вызов add в n раз.
Встраивание ([данные, вес, input_dim,…]) Он будет отображать целочисленные индексы в векторные представления, то есть вложения. На самом деле он отображает слова в векторы с действительными значениями в многомерном пространстве, что называется вложениями слов.
LinearRegressionOutput ([данные, метка,…]) Он вычисляет и оптимизирует квадрат потерь при обратном распространении, давая только выходные данные при прямом распространении.
LogisticRegressionOutput ([данные, метка,…]) Применяет ко входу логистическую функцию, которая также называется сигмоидной функцией. Функция вычисляется как 1/1 + exp (−x).
MAERegressionOutput ([данные, метка,…]) Этот оператор вычисляет среднюю абсолютную ошибку ввода. MAE - это фактически показатель риска, соответствующий ожидаемому значению абсолютной ошибки.
абс ([данные, имя, атрибут, выход]) Как следует из названия, эта функция будет возвращать поэлементное абсолютное значение ввода.
adagrad_update ([вес, степень, история, lr,…]) Это функция обновления для AdaGrad optimizer.
adam_update ([вес, степень, среднее, var, lr,…]) Это функция обновления для Adam optimizer.
add_n (* аргументы, ** kwargs) Как следует из названия, он будет добавлять все входные аргументы поэлементно.
arccos ([данные, имя, атрибут, выход]) Эта функция возвращает поэлементный обратный косинус входного массива.
точка ([lhs, rhs, transpose_a, transpose_b,…]) Как следует из названия, он даст скалярное произведение двух массивов. Это будет зависеть от размера входного массива: 1-D: внутреннее произведение векторов 2-D: умножение матриц ND: произведение суммы по последней оси первого входа и первой оси второго входа.
elemwise_add ([lhs, rhs, name, attr, out]) Как следует из названия, это будет add аргументы поэлементные.
elemwise_div ([lhs, rhs, name, attr, out]) Как следует из названия, это будет divide аргументы поэлементные.
elemwise_mul ([lhs, rhs, name, attr, out]) Как следует из названия, это будет Multiply аргументы поэлементные.
elemwise_sub ([lhs, rhs, name, attr, out]) Как следует из названия, он будет вычитать аргументы поэлементно.
exp ([данные, имя, атрибут, выход]) Эта функция вернет поэлементное экспоненциальное значение заданного ввода.
sgd_update ([вес, град, lr, wd,…]) Он действует как функция обновления для оптимизатора стохастического градиентного спуска.
сигмоид ([данные, имя, атрибут, выход]) Как следует из названия, он будет вычислять sigmoid из x поэлементно.
знак ([данные, имя, атрибут, выход]) Он вернет элементарный знак данного ввода.
sin ([данные, имя, атрибут, выход]) Как следует из названия, эта функция вычисляет поэлементный синус заданного входного массива.

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

В приведенном ниже примере мы собираемся случайным образом перемешать элементы, используя ElementWiseSum()функция. Он будет отображать целочисленные индексы в векторные представления, то есть вложения слов.

input_dim = 4
output_dim = 5

Example

/* Here every row in weight matrix y represents a word. So, y = (w0,w1,w2,w3)
y = [[ 0., 1., 2., 3., 4.],
[ 5., 6., 7., 8., 9.],
[ 10., 11., 12., 13., 14.],
[ 15., 16., 17., 18., 19.]]
/* Here input array x represents n-grams(2-gram). So, x = [(w1,w3), (w0,w2)]
x = [[ 1., 3.],
[ 0., 2.]]
/* Now, Mapped input x to its vector representation y.
Embedding(x, y, 4, 5) = [[[ 5., 6., 7., 8., 9.],
[ 15., 16., 17., 18., 19.]],
[[ 0., 1., 2., 3., 4.],
[ 10., 11., 12., 13., 14.]]]