파이토치 텐서 패딩하는 방법

파이토치 텐서 패딩하는 방법

Hot to Pad a Tensor in PyTorch

코드 1

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

  • input: 패딩할 텐서

  • pad: 패딩할 위치

  • mode: 패딩할 방법

  • mode: 패딩할 값

설명

  • pad

    $n$차원 텐서를 input으로 쓸 때, 최대 $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는 각 차원의 영번째, 마지막 값을 기준으로하여 대칭 복사한 값을 패딩한다. 이유는 모르겠지만 3차원 이상의 텐서만 입력으로 쓸 수 있고, 패딩사이즈는 $2(n-2)-$순서쌍으로 고정되어있다. 즉, 영번째와 첫번째 차원으로는 패딩되지 않는다.

    >>> 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는 각 차원의 값이 순환하도록 패딩된다.


  1. https://pytorch.org/docs/stable/generated/torch.nn.functional.pad.html ↩︎

댓글