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.]]])
replicate
は0番目と最後の値をそのまま複製してパディングし、circular
は各次元の値が循環するようにパディングされる。