PyTorch で conv2d + padding='same' 相当を行うメモ


pytorch で, numpy や tensorflow などでの padding='same'(名前がややこしいが, 畳み込んだ結果が入力画像と同じサイズになる)で畳み込み処理したい.

PyTorch 自体には, padding='same' 自体はないため, それ相当を自前で行うか, 上下左右の padding 幅が変わらないのであれば, 最近(少なくとも v1.6.0)では, Conv2d に padding 引数と, padding_mode を指定で対応できます. e.g.

conv = torch.nn.Conv2d(1, 1, kernel_size, padding=[kernel_size[1]//2, kernel_size[0] // 2], bias=False, padding_mode='replicate')

padding の幅は, kernel width size や stride などから自前で計算する必要があります.
discuss にあるように, 奇数の kernel 幅であれば kernel_width//2 で求まります.

padding_mode は, デフォルトの "zeros" だと, 端っこの結果が暗くなるので注意ください.
replicate or reflection あたりを指定がよいかと思います.