3秒でわかる
小さなフィルタを画像の上で滑らせ、輪郭や模様といった特徴を取り出す層。少ない重みで位置のずれに強く、画像認識のモデルの中心を担います。
もう少し詳しく
どういうものか
畳み込み層は、小さなフィルタ(カーネル)を入力の上で少しずつずらしながら重ね合わせ、その都度の積和を並べて新しい画像状のデータを作る層です。出てくるデータを特徴マップと呼びます。フィルタの数値は学習で決まり、縦の輪郭に強く反応するもの、特定の模様に反応するものといった役割を、モデルが自分で獲得していきます。
なぜ必要か
画像をそのまま全結合層へ流すと、28 かける 28 の小さな画像でも 784 個の入力になり、少し大きい画像では重みの数が現実的でなくなります。加えて、猫が画面の左にいても右にいても同じ猫だ、という当たり前の性質を学ぶために、位置ごとの学習をやり直す羽目になります。畳み込みは同じフィルタを全体で使い回すので、重みの数が桁違いに少なく、位置がずれても同じ特徴を拾えます。
具体例
import torch.nn as nn
layer = nn.Conv2d(
in_channels=3, # 入力はRGBの3<a href="/glossary/channel" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">チャンネル</a>
out_channels=32, # フィルタを32枚使う
kernel_size=3, # 3x3のフィルタ
stride=1, # 1画素ずつずらす
padding=1, # 周囲を埋めて大きさを保つ
)出力の大きさは、入力の辺の長さから計算できます。
出力 = (入力 + パディング*2 - カーネル) / ストライド + 1
= (32 + 1*2 - 3) / 1 + 1 = 32つまずきやすいところ
パディングを 0 のままフィルタを重ねると、層を通るたびに縦横が縮み、深い構成では途中で大きさが尽きます。3 かける 3 のフィルタなら padding を 1 にすると大きさが保たれます。もうひとつは入力の形の取り違えで、PyTorch はチャンネルが前、TensorFlow は後ろという並びの違いがあり、そのまま渡すと次元が合わずエラーになります。フィルタ枚数を増やすと表現力は上がりますが、計算時間はほぼ比例して伸びます。
似た用語との違い
| 層 | 役割 |
|---|---|
| 畳み込み層 | フィルタで局所的な特徴を抽出する |
| プーリング層 | 領域をまとめて縮小し、位置のずれに強くする |
| 全結合層 | 抽出済みの特徴から最終的な分類を出す |
覚え方
同じ虫めがねを画像の全域で使い回す層、と考えると要点を外しません。使い回すからこそ重みが少なく済み、被写体がどこに写っていても同じ特徴として拾えます。層を重ねるほど、輪郭から部品、部品から物体全体へと、見えるものの単位が大きくなっていきます。