logo

PyTorchテンソルをパディングする方法 📂機械学習

PyTorchテンソルをパディングする方法

コード 1

torch.nn.functional.pad(input, pad, mode='constant', value=0.0)

  • input: パディングするテンソル

  • pad: パディングの位置

  • mode: パディングの方法

  • value: パディングの値

説明

  • pad

    次元$n$のテンソルを入力とする時、最大で$2n-$組の引数を入力できる。

    $$ ((n-1)_{\text{low}}, (n-1)_{\text{up}}, (n-2)_{\text{low}}, (n-2)_{\text{up}}, \dots, 1_{\text{low}}, 1_{\text{up}}, 0_{\text{low}}, 0_{\text{up}}) $$

    $i_{\text{low}}$は$i$次元の低いインデックス側、つまり$0$番目の値の前にいくつパディングするかを示す。

    $i_{\text{up}}$は$i$次元の高いインデックス側、つまり最後の値の後にいくつパディングするかを示す。

    >>> A = torch.ones(2,3)
    >>> A
    tensor([[1., 1., 1.],
            [1., 1., 1.]])
    
    >>> PA = F.pad(A, (1,2,3,4), "constant", 0)
    tensor([[0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0.],
            [0., 1., 1., 1., 0., 0.],
            [0., 1., 1., 1., 0., 0.],
            [0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0.],
            [0., 0., 0., 0., 0., 0.]])
    
    >>> PA.shape
    torch.Size([9, 6])
    
  • mode

    constantは指定された全ての場所を固定の定数にマッピングする。

    >>> F.pad(A, (2,3), "constant", 3)
    tensor([[3., 3., 1., 1., 1., 3., 3., 3.],
            [3., 3., 1., 1., 1., 3., 3., 3.]])
    

    reflectは各次元の0番目と最後の値を基準にして、対称複製した値をパディングする。何故か3次元以上のテンソルのみ入力として使えるし、パディングサイズは$2(n-2)-$組に固定されている。つまり、0番目と1番目の次元にはパディングされない。

    >>> B = torch.tensor([[[1,2,3,4,5.]],[[6,7,8,9,10]]]
    tensor([[[ 1.,  2.,  3.,  4.,  5.]],
            [[ 6.,  7.,  8.,  9., 10.]]])
    >>> F.pad(B, (2,3), 'reflect')
    tensor([[[ 3.,  2.,  1.,  2.,  3.,  4.,  5.,  4.,  3.,  2.]],
            [[ 8.,  7.,  6.,  7.,  8.,  9., 10.,  9.,  8.,  7.]]])
    

    1.PNG

    replicateは0番目と最後の値をそのまま複製してパディングし、circularは各次元の値が循環するようにパディングされる。