SpaceToBatch¶
バージョン名: SpaceToBatch-2
カテゴリー: データ移動
簡単な説明: SpaceToBatch 操作は、data
入力の “空間” 次元 [1, ..., N - 1]
を block_shape
形状のブロックのグリッドに分割し、これらのブロックをバッチ次元 (0) でインターリーブします。出力では、空間次元 [1, ..., N - 1]
はグリッド内の位置に対応し、バッチ次元は空間ブロック内の位置と元のバッチ位置の両方を組み合わせます。ブロックに分割する前に、入力の空間次元は、pads_begin
および pads_end
に従ってオプションでゼロ埋められます。
詳細な説明:
この操作は、形状 [batch, D_1, D_2 ... D_{N - 1}]
の入力テンソル data
と、形状 [N]
の block_shape
、pads_begin
、pads_end
を Y 出力テンソルに変換することと等価です。
pads_begin
と pads_end
に従って、入力の次元 \([D_0, \dots, D_{N - 1}]\) の開始点と終了点をゼロで埋めます。
説明:
\(P_i\) = pads_begin[i] + pads_end[i]
\(B_i\) = block_shape[i]
バッチ次元の \(P_0\) は 0 (パディングなし) であると想定されます
バッチの \(B_0\) は無視されます
属性:
利用可能な属性はありません。
入力:
1:
data
- rank >= 2 の T1 タイプの入力 N-D テンソル[batch, D_1, D_2 ... D_{N - 1}]
。必須。2:
block_shape
-data
入力形状のサイズに等しい形状[N]
を持つ T2 タイプの入力 1 次元テンソル。すべての値は >= 1 である必要があります。block_shape[0]
は 1 であると予想されます。必須。3:
pads_begin
-data
入力形状のサイズに等しい形状[N]
を持つ T2 タイプの入力 1 次元テンソル。すべての値は負ではない必要があります。pads_begin
は、data
入力の各軸に沿った先頭のパディングを指定します。block_shape[i]
はdata_shape[i] + pads_begin[i] + pads_end[i]
を除算する必要があります。pads_begin[0]
は 0 であると予想されます。必須。4:
pads_end
-data
入力形状のサイズに等しい形状[N]
を持つ T2 タイプの入力 1 次元テンソル。すべての値は負ではない必要があります。pads_end
は、data
入力の各軸に沿った終了のパディングを指定します。block_shape[i]
はdata_shape[i] + pads_begin[i] + pads_end[i]
を除算する必要があります。pads_end[0]
は 0 であると予想されます。必須。
出力:
1:
data
入力と同じタイプの形状[batch * block_shape[0] * block_shape[1] * ... * block_shape[N - 1], (D_1 + pads_begin[1] + pads_end[1]) / block_shape[1], (D_2 + pads_begin[2] + pads_end[2]) / block_shape[2], ..., (D_{N -1} + pads_begin[N - 1] + pads_end[N - 1]) / block_shape[N - 1]
を持つ N-D テンソル。
タイプ:
T1: サポートされている任意のタイプ。
T2: サポートされている整数タイプ。
例:
<layer type="SpaceToBatch" ...>
<input>
<port id="0"> <!-- data -->
<dim>2</dim> <!-- batch -->
<dim>6</dim> <!-- spatial dimension 1 -->
<dim>10</dim> <!-- spatial dimension 2 -->
<dim>3</dim> <!-- spatial dimension 3 -->
<dim>3</dim> <!-- spatial dimension 4 -->
</port>
<port id="1"> <!-- block_shape value: [1, 2, 4, 3, 1] -->
<dim>5</dim>
</port>
<port id="2"> <!-- pads_begin value: [0, 0, 1, 0, 0] -->
<dim>5</dim>
</port>
<port id="3"> <!-- pads_end value: [0, 0, 1, 0, 0] -->
<dim>5</dim>
</port>
</input>
<output>
<port id="3">
<dim>48</dim> <!-- data.shape[0] * block_shape.shape[0] * block_shape.shape[1] *... * block_shape.shape[4] -->
<dim>3</dim> <!-- (data.shape[1] + pads_begin[1] + pads_end[1]) / block_shape.shape[1] -->
<dim>3</dim> <!-- (data.shape[2] + pads_begin[2] + pads_end[2]) / block_shape.shape[2] -->
<dim>1</dim> <!-- (data.shape[3] + pads_begin[3] + pads_end[3]) / block_shape.shape[3] -->
<dim>3</dim> <!-- (data.shape[4] + pads_begin[4] + pads_end[4]) / block_shape.shape[4] -->
</port>
</output>
</layer>