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> <!-- バッチ -->
<dim>6</dim> <!-- 空間次元 1 -->
<dim>10</dim> <!-- 空間次元 2 -->
<dim>3</dim> <!-- 空間次元 3 -->
<dim>3</dim> <!-- 空間次元 4 -->
</port>
<port id="1"> <!-- block_shape 値: [1, 2, 4, 3, 1] -->
<dim>5</dim>
</port>
<port id="2"> <!-- pads_begin 値: [0, 0, 1, 0, 0] -->
<dim>5</dim>
</port>
<port id="3"> <!-- pads_end 値: [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>