【chainer】F.padとF.pad_sequenceの使い方

chainerでpaddingするときの方法、備忘録。

パディングするベクトルを用意。

>>> from chainer import functions as F
>>> import numpy as np
>>> a = np.array([[1,2,3]], 'f')
>>> b = np.array([[1,2,3,4]], 'f')
>>> a
array([[ 1.,  2.,  3.]], dtype=float32)
>>> b
array([[ 1.,  2.,  3.,  4.]], dtype=float32)
F.pad

画像系で畳み込みするときとかに使う。

'''
F.pad(
    パディングしたいベクトル,
    パディングサイズ,
    ’constant’, 
    constant_values=パディングに使う数字
)
'''
>>> F.pad(a,5,'constant').data
array([[ 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.],
       [ 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.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  1.,  2.,  3.,  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.,  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.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
>>> F.pad(a,5,'constant',constant_values=-1).data
array([[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1.,  1.,  2.,  3., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
       [-1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1., -1.]], dtype=float32)
F.pad_sequence

僕がよく使ってよく忘れるのはF.pad_sequenceのほう。

'''
F.pad_sequence(
    パディングしたいベクトルのリスト,
    パディングサイズ,
    パディングに使う数字
)
'''
>>> F.pad_sequence(a,5).data
array([[ 1.,  2.,  3.,  0.,  0.]], dtype=float32)
>>> F.pad_sequence(b,5).data
array([[ 1.,  2.,  3.,  4.,  0.]], dtype=float32)

a,bをまとめてパディングしたかったら、次元を一つ落としたリストを食わせる。

>>> F.pad_sequence([a[0],b[0]],5).data
array([[ 1.,  2.,  3.,  0.,  0.],
       [ 1.,  2.,  3.,  4.,  0.]], dtype=float32)
>>> F.pad_sequence([a[0],b[0]],5, -1).data
array([[ 1.,  2.,  3., -1., -1.],
       [ 1.,  2.,  3.,  4., -1.]], dtype=float32)