Pad¶
バージョン名: Pad-12
カテゴリー: データ移動
簡単な説明: Pad 操作はエッジ上の入力テンソルを拡張します。パディングされた要素の量と値は、入力と属性によって定義されます。
詳細な説明: pad_mode 属性は、新しい要素値を生成する規則を指定します。例えば、指定された定数が入力されるか、入力テンソルの内容に基づいて生成されるかなどです。追加される新しい要素の数 (正の値) または削除される要素の数 (負の値) は、pads_begin
および pads_end
入力によって設定されます。
次の例は、指定された入力に対して Pad レイヤーの出力テンソルがどのように生成されるかを示しています。
ポジティブパッドの例¶
pads_begin = [0, 1]
pads_end = [2, 3]
DATA =
[[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]]
pad_mode 属性:
pad_mode = "constant"
:
OUTPUT =
[[ 0, 1, 2, 3, 4, 0, 0, 0 ]
[ 0, 5, 6, 7, 8, 0, 0, 0 ]
[ 0, 9, 10, 11, 12, 0, 0, 0 ]
[ 0, 0, 0, 0, 0, 0, 0, 0 ]
[ 0, 0, 0, 0, 0, 0, 0, 0 ]]
pad_mode = "edge"
:
OUTPUT =
[[ 1, 1, 2, 3, 4, 4, 4, 4 ]
[ 5, 5, 6, 7, 8, 8, 8, 8 ]
[ 9, 9, 10, 11, 12, 12, 12, 12 ]
[ 9, 9, 10, 11, 12, 12, 12, 12 ]
[ 9, 9, 10, 11, 12, 12, 12, 12 ]]
pad_mode = "reflect"
:
OUTPUT =
[[ 2, 1, 2, 3, 4, 3, 2, 1 ]
[ 6, 5, 6, 7, 8, 7, 6, 5 ]
[ 10, 9, 10, 11, 12, 11, 10, 9 ]
[ 6, 5, 6, 7, 8, 7, 6, 5 ]
[ 2, 1, 2, 3, 4, 3, 2, 1 ]]
pad_mode = "symmetric"
:
OUTPUT =
[[ 1, 1, 2, 3, 4, 4, 3, 2 ]
[ 5, 5, 6, 7, 8, 8, 7, 6 ]
[ 9, 9, 10, 11, 12, 12, 11, 10 ]
[ 9, 9, 10, 11, 12, 12, 11, 10 ]
[ 5, 5, 6, 7, 8, 8, 7, 6 ]]
ネガティブパッドの例¶
pads_begin = [-1, -1]
pads_end = [-1, -1]
DATA =
[[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]]
Shape(3, 4)
すべての pad_mode 属性オプション:
pad_mode = "constant"
pad_mode = "edge"
pad_mode = "reflect"
pad_mode = "symmetric"
OUTPUT =
[[ 6, 7 ]]
Shape(1, 2)
混合パッドの例¶
pads_begin = [2, -1]
pads_end = [-1, 3]
DATA =
[[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]]
Shape(3, 4)
pad_mode = "constant"
:
OUTPUT =
[[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[2, 3, 4, 0, 0, 0],
[6, 7, 8, 0, 0, 0]]
Shape(4, 6)
pad_mode = "edge"
:
OUTPUT Shape(4, 6) =
[[2, 3, 4, 4, 4, 4],
[2, 3, 4, 4, 4, 4],
[2, 3, 4, 4, 4, 4],
[6, 7, 8, 8, 8, 8]]
Shape(4, 6)
pad_mode = "reflect"
:
OUTPUT =
[[10, 11, 12, 11, 10, 9],
[6, 7, 8, 7, 6, 5],
[2, 3, 4, 3, 2, 1],
[6, 7, 8, 7, 6, 5]]
Shape(4, 6)
pad_mode = "symmetric"
:
OUTPUT =
[[6, 7, 8, 8, 7, 6],
[2, 3, 4, 4, 3, 2],
[2, 3, 4, 4, 3, 2],
[6, 7, 8, 8, 7, 6]]
Shape(4, 6)
属性:
-
pad_mode
説明: pad_mode は、パディング値の生成に使用される方法を指定します。
-
値の範囲: 文字列形式のメソッド名:
constant
- パディングされた値は、pad_value 入力から取得されます。入力が提供されない場合、パディング要素はゼロに等しくなります。edge
- パディングされた値は、入力data
テンソルのそれぞれのエッジからコピーされます。reflect
- パディングされた値は入力データテンソルを反映しています。エッジの値は重複せず、pads_begin[D]
とpads_end[D]
は、有効なD
に対してdata.shape[D] – 1
より大きくてはなりません。symmetric
- パディングされた値は、入力data
テンソルから対称的に追加されます。この方法はreflect
と似ていますが、エッジの値が複製されます。詳細については、上記の例を参照してください。有効なD
は、pads_begin[D]
とpads_end[D]
がdata.shape[D]
を超えてはなりません。
タイプ:
string
必須: はい
入力:
1: 任意の形状およびタイプ T の
data
テンソル。必須。2:
pads_begin
T_INT タイプの 1D テンソル。要素数は入力データの形状ランクと一致します。各軸の先頭に追加するパディング要素の数を指定します。負の値は、対応する次元の値が切り取られることを意味します。必須。3:
pads_end
T_INT タイプの 1D テンソル。要素数は入力データの形状ランクと一致します。各軸の末尾に追加するパディング要素の数を指定します。負の値は、対応する次元の値が切り取られることを意味します。必須。4:
pad_value
T タイプのスカラーテンソル。pad_mode == "constant"
の場合にのみ有効です。すべてのパディング要素にはこの値が設定されるか、入力が指定されていない場合は 0 が設定されます。この入力は、pad_mode
以外の値を設定しないでください。オプション。
出力:
1:
0
からlen(data.shape) - 1
までの各D
の次元max(pads_begin[D] + data.shape[D] + pads_end[D], 0)
を持つ T タイプのパディングされた出力テンソル。
タイプ:
T: 任意の数値タイプ。
T_INT: 任意の整数タイプ。
例: 定数モード (ポジティブパッド)
<layer ... type="Pad" ...>
<data pad_mode="constant"/>
<input>
<port id="0">
<dim>1</dim>
<dim>3</dim>
<dim>32</dim>
<dim>40</dim>
</port>
<port id="1">
<dim>4</dim> <!-- pads_begin = [0, 5, 2, 1] -->
</port>
<port id="2">
<dim>4</dim> <!-- pads_end = [1, 0, 3, 7] -->
</port>
<port id="3">
<!-- pad_value = 15.0 -->
</port>
</input>
<output>
<port id="0">
<dim>2</dim> <!-- 2 = 0 + 1 + 1 = pads_begin[0] + input.shape[0] + pads_end[0] -->
<dim>8</dim> <!-- 8 = 5 + 3 + 0 = pads_begin[1] + input.shape[1] + pads_end[1] -->
<dim>37</dim> <!-- 37 = 2 + 32 + 3 = pads_begin[2] + input.shape[2] + pads_end[2] -->
<dim>48</dim> <!-- 48 = 1 + 40 + 7 = pads_begin[3] + input.shape[3] + pads_end[3] -->
<!-- all new elements are filled with 15.0 value -->
</port>
</output>
</layer>
例: 定数モード (ポジティブおよびネガティブパッド)
<layer ... type="Pad" ...>
<data pad_mode="constant"/>
<input>
<port id="0">
<dim>2</dim>
<dim>3</dim>
<dim>32</dim>
<dim>40</dim>
</port>
<port id="1">
<dim>4</dim> <!-- pads_begin = [0, -2, -8, 1] -->
</port>
<port id="2">
<dim>4</dim> <!-- pads_end = [-1, 4, -6, 7] -->
</port>
<port id="3">
<!-- pad_value = 15.0 -->
</port>
</input>
<output>
<port id="0">
<dim>1</dim> <!-- 2 = 0 + 2 + (-1) = pads_begin[0] + input.shape[0] + pads_end[0] -->
<dim>5</dim> <!-- 5 = (-2) + 3 + 4 = pads_begin[1] + input.shape[1] + pads_end[1] -->
<dim>18</dim> <!-- 18 = (-8) + 32 (-6) = pads_begin[2] + input.shape[2] + pads_end[2] -->
<dim>48</dim> <!-- 48 = 1 + 40 + 7 = pads_begin[3] + input.shape[3] + pads_end[3] -->
<!-- all new elements are filled with 15.0 value -->
</port>
</output>
</layer>
例: エッジモード
<layer ... type="Pad" ...>
<data pad_mode="edge"/>
<input>
<port id="0">
<dim>1</dim>
<dim>3</dim>
<dim>32</dim>
<dim>40</dim>
</port>
<port id="1">
<dim>4</dim> <!-- pads_begin = [0, 5, 2, 1] -->
</port>
<port id="2">
<dim>4</dim> <!-- pads_end = [1, 0, 3, 7] -->
</port>
</input>
<output>
<port id="0">
<dim>2</dim> <!-- 2 = 0 + 1 + 1 = pads_begin[0] + input.shape[0] + pads_end[0] -->
<dim>8</dim> <!-- 8 = 5 + 3 + 0 = pads_begin[1] + input.shape[1] + pads_end[1] -->
<dim>37</dim> <!-- 37 = 2 + 32 + 3 = pads_begin[2] + input.shape[2] + pads_end[2] -->
<dim>48</dim> <!-- 48 = 1 + 40 + 7 = pads_begin[3] + input.shape[3] + pads_end[3] -->
</port>
</output>
</layer>