Engineering python pytorch 機械学習

Pytorch入門:torch.nn.Conv2dの徹底解説と活用方法

pytorchでCNNを組んでいると、torch.nn.Conv2dをよく利用すると思います。なんとなくtorch.nn.Conv2dを書いていてもCNNが書けてしまうのがpytorchの秀でているところなのですが、きちんと仕様を理解することで、自分の狙ったネットワークが定義できるようになります。そこで今回は、pytorchの公式ドキュメントを元に、torch.nn.Conv2d について整理していければと思います!

公式ドキュメント

以下のpytorchの公式ドキュメントを元に、Conv2dに関して整理をしていきます。

引数

torch.nn.Conv2d における引数は以下になります。

引数名デフォルト説明
in_channelsint-レイヤーに入力される特徴マップのChannel数
out_channelsint-レイヤーから出力される特徴マップのChannel数
kernel_sizeint or tuple-畳み込みフィルタのサイズ
strideint or tuple(optional)1フィルタのストライドサイズ
paddingint or tuple or str(optional)0入力特徴マップをパディングして拡張するかどうか。
dilationint or tuple (optional)1フィルタの間隔
groupsint (optional)1入力と出力のテンソルのグループの数
biasbool (optional)Trueバイアス項を追加するか否か
padding_modestr (optional)zerosパディングの仕方の指定
devicedevice (optional)None計算に使用するデバイスを指定(cpu, cuda etc...)
dtypedtype (optional)Noneテンソルの型
torch.nn.Conv2d の引数

詳細

torch.nn.Conv2d の各引数に関して、それぞれ詳細に見ていきます。本項で載せている畳み込みの画像は以下より引用しています。非常にわかりやすいVisualizeなのでこちらも参考にしてください。

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ができなくなってしまいますので、以下の式は覚えておくとよいかもしれません。

公式ドキュメントより引用(https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html)

まとめ

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

-Engineering, python, pytorch, 機械学習
-, ,