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 - パディングされた値は入力 data テンソルを反映しています。エッジの値は重複せず、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: 任意の形状およびタイプ Tdata テンソル。必須。

  • 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] --> <!-- すべての新しい要素は値 15.0 で埋められます --> 
        </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] --> <!-- すべての新しい要素は値 15.0 で埋められます --> 
        </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>