파이토치 텐서 패딩하는 방법
코드 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.]]])
replicate
는 0번째와 마지막 값을 그대로 복사하여 패딩하고,circular
는 각 차원의 값이 순환하도록 패딩된다.