【PyTorch】Paddingのカスタマイズ – ConstantPad2dとは?パディングで0以外の数字を使いたい

Python

畳み込み層でのPaddingオプション

PyTorchの自作モデルでのパディングオプションの使い方はnn.Conv2dの引数でpaddingに数値を代入することでです。

padding=1だと入力画像の上下左右1ピクセルを0でパディングします。これは主にカーネルサイズが3のときに使われます。

padding=2とすると上下左右2ピクセルを0でパディングします。カーネルサイズ5のときに使われます。

敢えてパディングしたくないときはpadding=0とします。以下、paddingオプションを使ったモデルです。

class MyNet(nn.Module):

    def __init__(self):
        super(MyNet, self).__init__()
        self.features = nn.Sequential(
            
            nn.Conv2d(3, 128, kernel_size=3, padding=1),
            nn.BatchNorm2d(128),

            nn.Conv2d(128, 128, kernel_size=3, padding=1),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.BatchNorm2d(128),

            nn.Conv2d(128, 256, kernel_size=3, padding=1),
            nn.BatchNorm2d(256),

            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.BatchNorm2d(256),

            nn.Conv2d(256, 512, kernel_size=3, padding=1),
            nn.BatchNorm2d(512),

            nn.Conv2d(512, 512, kernel_size=3, padding=1),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.BatchNorm2d(512),
        )
        self.classifier = nn.Sequential(
       
            nn.Linear(512 * 4 * 4, 1024),
            nn.BatchNorm1d(1024),
            
            nn.Linear(1024, 1024),
            nn.BatchNorm1d(1024),
      
            nn.Linear(1024, 10),
            nn.BatchNorm1d(10),
        )

    def forward(self, x):
        x = self.features(x)
        x = x.view(-1, 512 * 4 * 4)
        x = self.classifier(x)
        return x

0以外の数字でパディング

PyTorchのデフォルトではpadding処理は0を加えることになっています。実験で0以外の数値を使いたい場合はnn.ConstantPad2d()を使います。

第1引数にパディングするピクセル数、第2引数にパディングの数値を記述します。

例えば、入力画像の上下左右1ピクセルを0でパディングしたいときはnn.ConstantPad2d(1,0)とします。

実際に作成したモデルです。

class MyNet(nn.Module):

    def __init__(self):
        super(MyNet, self).__init__()
        self.features = nn.Sequential(
            nn.ConstantPad2d(1,0),
            nn.Conv2d(3, 128, kernel_size=3, padding=0,bias=None),
            nn.BatchNorm2d(128),

            nn.ConstantPad2d(1,0),
            nn.Conv2d(128, 128, kernel_size=3, padding=0, bias=None),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.BatchNorm2d(128),

            nn.ConstantPad2d(1,0),
            nn.Conv2d(128, 256, kernel_size=3, padding=0, bias=None),
            nn.BatchNorm2d(256),

            nn.ConstantPad2d(1,0),
            nn.Conv2d(256, 256, kernel_size=3, padding=0, bias=None),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.BatchNorm2d(256),

            nn.ConstantPad2d(1,0),
            nn.Conv2d(256, 512, kernel_size=3, padding=0, bias=None),
            nn.BatchNorm2d(512),

            nn.ConstantPad2d(1,0),
            nn.Conv2d(512, 512, kernel_size=3, padding=0, bias=None),
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.BatchNorm2d(512),
        )
        self.classifier = nn.Sequential(
       
            nn.Linear(512 * 4 * 4, 1024),
            nn.BatchNorm1d(1024),
            
            nn.Linear(1024, 1024),
            nn.BatchNorm1d(1024),
      
            nn.Linear(1024, 10),
            nn.BatchNorm1d(10),
        )

    def forward(self, x):
        x = self.features(x)
        x = x.view(-1, 512 * 4 * 4)
        x = self.classifier(x)
        return x

最後に

以上がPyTorchでのパディング処理のカスタマイズです。

ConstantPad2dでは今回紹介した以外にも様々な使い方が可能です。入力画像の右側だけパディングすることもできます。

参考資料

コメント

タイトルとURLをコピーしました