
pytorchでCNNを組んでいると、torch.nn.Conv2dをよく利用すると思います。なんとなくtorch.nn.Conv2dを書いていてもCNNが書けてしまうのがpytorchの秀でているところなのですが、きちんと仕様を理解することで、自分の狙ったネットワークが定義できるようになります。そこで今回は、pytorchの公式ドキュメントを元に、torch.nn.Conv2d について整理していければと思います!
公式ドキュメント
以下のpytorchの公式ドキュメントを元に、Conv2dに関して整理をしていきます。
公式ドキュメント:https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html
引数
torch.nn.Conv2d における引数は以下になります。
| 引数名 | 型 | デフォルト | 説明 |
| in_channels | int | - | レイヤーに入力される特徴マップのChannel数 |
| out_channels | int | - | レイヤーから出力される特徴マップのChannel数 |
| kernel_size | int or tuple | - | 畳み込みフィルタのサイズ |
| stride | int or tuple(optional) | 1 | フィルタのストライドサイズ |
| padding | int or tuple or str(optional) | 0 | 入力特徴マップをパディングして拡張するかどうか。 |
| dilation | int or tuple (optional) | 1 | フィルタの間隔 |
| groups | int (optional) | 1 | 入力と出力のテンソルのグループの数 |
| bias | bool (optional) | True | バイアス項を追加するか否か |
| padding_mode | str (optional) | zeros | パディングの仕方の指定 |
| device | device (optional) | None | 計算に使用するデバイスを指定(cpu, cuda etc...) |
| dtype | dtype (optional) | None | テンソルの型 |
詳細
torch.nn.Conv2d の各引数に関して、それぞれ詳細に見ていきます。本項で載せている畳み込みの画像は以下より引用しています。非常にわかりやすいVisualizeなのでこちらも参考にしてください。
引用先:https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
in_channels
畳み込み層に入力される特徴マップのchannel数を渡します。ドキュメントを見ると入力画像のチャネル数と書いてありますが、基本は入力される前のレイヤーのチャネル数だと考えればよいと思います。
out_channels
畳み込み層の出力にしたいチャネル数を渡します。
kernel_size
畳み込みのフィルタサイズをを渡します。以下の画像でいうところの濃紺の部分になります。以下の画像の場合は、kernel_size=3になります。またtupleを受け取ることもできるので、widthとheightでサイズを変えることも可能です。

stride
畳み込みのフィルタをどの程度ずらすのかをストライドと呼びます。ここではその値を指定します。
padding
パディングとは、入力マップの周りを何かしらの要素で補填することを言います。これを行うことで畳み込み層の出力のサイズを調節することができます。下記の図はpadding=2、または(2, 2)の場合で、点線部分のグリッドサイズを指定することになります。

ここではintやtuplenのほかにstringでモードを指定することも可能です。
- same
- strideが1の時しか使用できませんが、出力のテンソルサイズが入力と同じになるようにpaddingしてくれます。
- 追記:kerasの場合は、基本Strideによるリサイズになるようにpaddingしてくれます。例えばstrideが2である場合は、WHが半分のサイズになりますが、pytorchは少し仕様が違うみたいです。
- valid
- sameのような補完はせず、kernel_sizeとstrideの影響を受けたサイズになります。
dilation
フィルタ内に間隔を作りたい場合は、ここの値を指定します。1で敷き詰めることになり、2で以下の図のようなフィルタになります。間隔をあけてフィルタが畳み込みをしているのがわかると思います。

groups
基本ここは1にしておけば通常の畳み込みになるのですが、2以上で入力と出力のテンソルを分割して、それぞれで畳み込みをすることになります。
bias
畳み込み後の重みにバイアス項を追加するか同課を渡します。
padding_mode
どのようにパディングするかを指定します。
- zero : いわゆるゼロパディングを行います。
- reflect : 入力テンソルのエッジを反転した要素を周りに配置していきます。
- replicate : 入力テンソルのエッジの要素を周りに配置していきます。
- circular : 入力テンソルの周囲を循環させてパディングを行います。
device
GPUなどがある場合には、ここでcudaと指定することで、GPUで計算をすることができます。
dtype
テンソルの型を指定できます。
出力テンソルサイズの計算
padding、dilation、kernel_sizeの影響を受けるようで、以下のような計算式で出力のWHが計算されます。DNNのアーキテクチャを詳細設計するときには、ここの計算がレイヤー間で合わないとTrainができなくなってしまいますので、以下の式は覚えておくとよいかもしれません。

まとめ
torch.nn.Conv2d について公式ドキュメントを元にまとめてみました。わたくしは画像系の機械学習をメインでやっていますので、そこで使われる基本的な引数しか使ってませんでしたが、こうしてみると多様なやり方があるみたいですね。機会があれば使ってみたいと思います。