ApacheMXNet-PythonAPIシンボル

この章では、Symbolと呼ばれるMXNetのインターフェイスについて学習します。

Mxnet.ndarray

ApacheMXNetのSymbolAPIは、シンボリックプログラミング用のインターフェイスです。Symbol APIは、以下の使用を特徴としています。

  • 計算グラフ

  • メモリ使用量の削減

  • 使用前の機能の最適化

以下の例は、MXNetのSymbolAPIを使用して簡単な式を作成する方法を示しています。

通常のPythonリストからの1-Dおよび2-D '配列'を使用した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

Output

次の出力が表示されます-

<Symbol _plus0>

Example

(x, y, z)

Output

出力は以下のとおりです。

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

ここで、MXNetのndarray APIのクラス、関数、およびパラメーターについて詳しく説明します。

クラス

次の表は、MXNetのSymbolAPIのクラスで構成されています。

クラス 定義
シンボル(ハンドル) このクラス、つまりシンボルは、ApacheMXNetのシンボリックグラフです。

関数とそのパラメーター

以下は、mxnet.SymbolAPIでカバーされる重要な関数とそのパラメーターの一部です。

関数とそのパラメータ 定義
Activation([data、act_type、out、name]) 活性化関数を要素ごとに入力に適用します。サポートしていますrelu, sigmoid, tanh, softrelu, softsign 活性化関数。
BatchNorm([データ、ガンマ、ベータ、移動平均、…]) バッチ正規化に使用されます。この関数は、平均と分散によってデータバッチを正規化します。スケールを適用しますgamma とオフセット beta
BilinearSampler([data、grid、cudnn_off、…]) この関数は、入力フィーチャマップに双一次サンプリングを適用します。実はそれが「空間トランスフォーマーネットワーク」のカギです。OpenCVのリマップ関数に精通している場合、この関数の使用法はそれと非常に似ています。唯一の違いは、バックワードパスがあることです。
BlockGrad([データ、出力、名前]) 名前が示すように、この関数は勾配計算を停止します。基本的に、入力の累積勾配がこの演算子を逆方向に流れるのを防ぎます。
cast([data、dtype、out、name]) この関数は、入力のすべての要素を新しいタイプにキャストします。
この関数は、入力のすべての要素を新しいタイプにキャストします。 この関数は、名前が指定されているように、ゼロで埋められた、指定された形状とタイプの新しいシンボルを返します。
ones(shape [、dtype]) この関数は、指定された名前として、指定された形状とタイプの新しいシンボルを返します。
full(shape、val [、dtype]) この関数は、指定された名前として、指定された値で満たされた、指定された形状とタイプの新しい配列を返します val
arange(start [、stop、step、repeat、…]) 指定された間隔内で等間隔の値を返します。値は、半分開いた間隔[開始、停止)内で生成されます。これは、間隔に次のものが含まれることを意味します。start ただし、除外します stop
linspace(start、stop、num [、endpoint、name、…]) 指定された間隔内で等間隔の数値を返します。関数arrange()と同様に、値は半分開いた間隔[start、stop)内で生成されます。これは、間隔に次のものが含まれることを意味します。start ただし、除外します stop
ヒストグラム(a [、ビン、範囲]) 名前が示すように、この関数は入力データのヒストグラムを計算します。
power(base、exp) 名前が示すように、この関数は要素ごとの結果を返します。 base から累乗された要素 exp素子。baseとexpの両方の入力は、Symbolまたはscalarのいずれかです。ここで、放送は許可されていないことに注意してください。使用できます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

Contrib NDArray APIは、symbol.contribパッケージで定義されています。これは通常、新機能のための多くの便利な実験的APIを提供します。このAPIは、コミュニティが新機能を試すことができる場所として機能します。機能の寄稿者もフィードバックを受け取ります。

関数とそのパラメーター

以下は、以下でカバーされる重要な機能とそのパラメータの一部です。 mxnet.symbol.contrib API

関数とそのパラメータ 定義
rand_zipfian(true_classes、num_sampled、…) この関数は、ほぼジップの分布からランダムサンプルを抽出します。この関数の基本分布はジップの分布です。この関数は、num_sampled候補をランダムにサンプリングし、sampled_candidatesの要素は上記の基本分布から抽出されます。
foreach(body、data、init_states) 名前が示すように、この関数は、次元0のNDArrayに対してユーザー定義の計算を使用してループを実行します。この関数はforループをシミュレートし、bodyはforループの反復の計算を行います。
while_loop(cond、func、loop_vars [、…]) 名前が示すように、この関数は、ユーザー定義の計算とループ条件を使用してwhileループを実行します。この関数は、条件が満たされた場合に文字通りカスタマイズされた計算を行うwhileループをシミュレートします。
cond(pred、then_func、else_func) 名前が示すように、この関数は、ユーザー定義の条件と計算を使用してif-then-elseを実行します。この関数は、指定された条件に従って2つのカスタマイズされた計算のいずれかを実行することを選択するif-likeブランチをシミュレートします。
getnnz([data、axis、out、name]) この関数は、スパーステンソルに格納されている値の数を示します。また、明示的なゼロも含まれます。CPU上のCSRマトリックスのみをサポートします。
requantize([data、min_range、max_range、…]) この関数は、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([queries、…]) この演算子は、エンコーダーデコーダーとして使用されるマルチヘッドアテンションでのクエリとキーの射影間の行列乗算を計算します。条件は、入力がレイアウトに従うクエリの射影のテンソルである必要があることです:(seq_length、batch_size、num_heads *、head_dim)。

実装例

以下の例では、関数rand_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)>

symbol.image

Image Symbol APIは、symbol.imageパッケージで定義されています。名前が示すように、通常は画像とその機能に使用されます。

関数とそのパラメーター

以下は、以下でカバーされる重要な機能とそのパラメータの一部です。 mxnet.symbol.image API

関数とそのパラメータ 定義
Adjust_lighting([data、alpha、out、name]) 名前が示すように、この関数は入力の照明レベルを調整します。AlexNetスタイルに従います。
Crop([データ、x、y、幅、高さ、出力、名前]) この関数を使用して、形状(H x W x C)または(N x H x W x C)の画像NDArrayをユーザーが指定したサイズにトリミングできます。
normalize([data、mean、std、out、name]) 形状(C x H x W)または(N x C x H x W)のテンソルを次のように正規化します。 mean そして standard deviation(SD)
random_crop([data、xrange、yrange、width、…]) Crop()と同様に、形状(H x W x C)または(N x H x W x C)の画像NDArrayをユーザーが指定したサイズにランダムにトリミングします。次の場合、結果をアップサンプリングしますsrc よりも小さい size
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がサイズよりも小さい場合、結果をアップサンプリングします。面積とアスペクト比もランダム化されます。
サイズ変更([データ、サイズ、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を、形状(C x H x W)または(のテンソルNDArrayに変換します。 N x C x H x W)で、値は[0、1]の範囲です。

実装例

以下の例では、関数to_tensorを使用して、[0、255]の範囲の値を持つ形状(H x W x C)または(N x H x W x C)の画像NDArrayをテンソルNDArrayに変換します。 [0、1]の範囲の値を持つ形状(C x H x W)または(N x C x H x W)の。

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>

symbol.random

Random Symbol APIは、symbol.randomパッケージで定義されています。名前が示すように、MXNetのランダム配布ジェネレーターSymbolAPIです。

関数とそのパラメーター

以下は、以下でカバーされる重要な機能とそのパラメータの一部です。 mxnet.symbol.random API

関数とそのパラメータ 定義
ユニフォーム([低、高、形状、dtype、ctx、出力]) 一様分布からランダムサンプルを生成します。
normal([loc、scale、shape、dtype、ctx、out]) 正規(ガウス)分布からランダムサンプルを生成します。
randn(* shape、** kwargs) 正規(ガウス)分布からランダムサンプルを生成します。
poisson([lam、shape、dtype、ctx、out]) ポアソン分布からランダムサンプルを生成します。
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、…]) 一般化された負の二項分布からランダムサンプルを生成します。
シャッフル(データ、** kwargs) 要素をランダムにシャッフルします。
randint(low、high [、shape、dtype、ctx、out]) 離散一様分布からランダムサンプルを生成します。
exponential_like([data、lam、out、name]) 入力配列の形状に従って、指数分布からランダムサンプルを生成します。
gamma_like([data、alpha、beta、out、name]) 入力配列の形状に応じて、ガンマ分布からランダムサンプルを生成します。
generalized_negative_binomial_like([data、…]) 入力配列の形状に従って、一般化された負の二項分布からランダムサンプルを生成します。
negative_binomial_like([data、k、p、out、name]) 入力配列の形状に従って、負の二項分布からランダムサンプルを生成します。
normal_like([data、loc、scale、out、name]) 入力配列の形状に従って、正規(ガウス)分布からランダムサンプルを生成します。
poisson_like([data、lam、out、name]) 入力配列の形状に従って、ポアソン分布からランダムサンプルを生成します。
Uniform_like([data、low、high、out、name]) 入力配列の形状に応じて、一様分布からランダムサンプルを生成します。

実装例

以下の例では、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>

symbol.sparse

Sparse Symbol APIは、mxnet.symbol.sparseパッケージで定義されています。名前が示すように、CPU上でスパースニューラルネットワークグラフと自動微分を提供します。

関数とそのパラメーター

以下は、いくつかの重要な関数(シンボル作成ルーチン、シンボル操作ルーチン、数学関数、三角関数、双曲線関数、縮小関数、丸め、累乗、ニューラルネットワークを含む)とそれらのパラメーターがカバーするものです。 mxnet.symbol.sparse API

関数とそのパラメータ 定義
ElementWiseSum(* args、** kwargs) この関数は、すべての入力引数を要素ごとに追加します。たとえば、_(1,2、…= 1 + 2 +⋯+)。ここで、add_nは、addをn回呼び出すよりも潜在的に効率的であることがわかります。
埋め込み([データ、重み、input_dim、…]) 整数インデックスをベクトル表現、つまり埋め込みにマップします。実際には、単語の埋め込みと呼ばれる高次元空間の実数値のベクトルに単語をマッピングします。
LinearRegressionOutput([data、label、…]) 逆伝播中の損失の2乗を計算して最適化し、順伝播中の出力データのみを提供します。
LogisticRegressionOutput([data、label、…]) シグモイド関数とも呼ばれるロジスティック関数を入力に適用します。関数は1/1 + exp(-x)として計算されます。
MAERegressionOutput([data、label、…]) この演算子は、入力の平均絶対誤差を計算します。MAEは、実際には絶対誤差の期待値に対応するリスク指標です。
abs([data、name、attr、out]) 名前が示すように、この関数は入力の要素ごとの絶対値を返します。
adagrad_update([weight、grad、history、lr、…]) の更新機能です AdaGrad optimizer
adam_update([weight、grad、mean、var、lr、…]) の更新機能です Adam optimizer
add_n(* args、** kwargs) 名前が示すように、すべての入力引数を要素ごとに追加します。
arccos([データ、名前、属性、出力]) この関数は、入力配列の要素ごとの逆余弦を返します。
dot([lhs、rhs、transpose_a、transpose_b、…]) 名前が示すように、2つの配列の内積が得られます。これは、入力配列の次元に依存します。1-D:ベクトルの内積2-D:行列の乗算ND:最初の入力の最後の軸と2番目の入力の最初の軸の合計積。
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([weight、grad、lr、wd、…]) これは、確率的勾配降下オプティマイザーの更新関数として機能します。
sigmoid([data、name、attr、out]) 名前が示すように、それは計算します sigmoid x要素の賢明な。
sign([データ、名前、属性、出力]) 指定された入力の要素ごとの符号を返します。
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.]]]