畳み込みニューラルネットワーク

PyTorchによる中級ディープラーニング

Michal Oleszak

Machine Learning Engineer

なぜ全結合層ではないのか?

256×256のグレースケール画像を表す黒い正方形。

PyTorchによる中級ディープラーニング

なぜ全結合層ではないのか?

約6.5万ピクセルから成る256×256のグレースケール画像。

PyTorchによる中級ディープラーニング

なぜ全結合層ではないのか?

6.5万ピクセル値を1000個のニューロンの全結合層で処理。

PyTorchによる中級ディープラーニング

なぜ全結合層ではないのか?

画像と層の間に6,500万の結合がある。

PyTorchによる中級ディープラーニング

なぜ全結合層ではないのか?

RGB画像では2億の結合になる。

PyTorchによる中級ディープラーニング

なぜ全結合層ではないのか?

  • 全結合層:
    • 学習が遅い
    • 過学習しやすい
    • 空間パターンを認識できない
  • 代替: 畳み込み層!

画像の隅の猫と、その部分のみを読むニューロン

PyTorchによる中級ディープラーニング

畳み込み層

3×3のフィルタが5×5の入力上をスライドし、3×3の特徴マップを生成。

  • パラメータ化されたフィルタを入力上でスライド
  • 各位置で畳み込みを実行
  • 得られる特徴マップ:
    • 入力の空間パターンを保持
    • 全結合層よりパラメータが少ない
  • 1フィルタ=1特徴マップ
  • 特徴マップに活性化関数を適用
  • すべての特徴マップを結合して出力
  • nn.Conv2d(3, 32, kernel_size=3)
PyTorchによる中級ディープラーニング

畳み込み

2つの3×3行列を要素ごとに乗算し、結果を総和。

  1. 入力パッチとフィルタのドット積を計算
    • 左上の要素: 2 × 1 = 2
  2. 結果を合計
PyTorchによる中級ディープラーニング

ゼロパディング

4×4の画像の周囲を値0のピクセルで縁取り。

  • 畳み込み層の入力に0の枠を追加
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • 入出力テンソルの空間サイズを維持
  • 境界のピクセルも同等に扱う
PyTorchによる中級ディープラーニング

最大プーリング

各2×2の区画が異なる色で示された4×4行列が、最大プーリングで2×2に縮小。

  • 非重複ウィンドウを入力上でスライド
  • 各位置で最大値のみ保持
  • 畳み込み層の後で空間サイズを削減
  • nn.MaxPool2d(kernel_size=2)
PyTorchによる中級ディープラーニング

畳み込みニューラルネットワーク

class Net(nn.Module):
    def __init__(self, num_classes):
        super().__init__()

self.feature_extractor = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Flatten(), )
self.classifier = nn.Linear(64*16*16, num_classes)
def forward(self, x): x = self.feature_extractor(x) x = self.classifier(x) return x
  • feature_extractor:(畳み込み→活性化→プーリング)を2回、最後に平坦化
  • classifier: 単一の全結合層
  • forward(): 入力画像を特徴抽出器と分類器に順伝播
PyTorchによる中級ディープラーニング

特徴抽出部の出力サイズ

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

入力3×64×64の画像が、畳み込み→プーリング→畳み込み→プーリングを通過する模式図。

PyTorchによる中級ディープラーニング

特徴抽出部の出力サイズ

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

入力3×64×64の画像が、畳み込み→プーリング→畳み込み→プーリングを通過する模式図。

PyTorchによる中級ディープラーニング

特徴抽出部の出力サイズ

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

入力3×64×64の画像が、畳み込み→プーリング→畳み込み→プーリングを通過する模式図。

PyTorchによる中級ディープラーニング

特徴抽出部の出力サイズ

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

入力3×64×64の画像が、畳み込み→プーリング→畳み込み→プーリングを通過する模式図。

PyTorchによる中級ディープラーニング

特徴抽出部の出力サイズ

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

入力3×64×64の画像が、畳み込み→プーリング→畳み込み→プーリングを通過する模式図。

PyTorchによる中級ディープラーニング

Passons à la pratique !

PyTorchによる中級ディープラーニング

Preparing Video For Download...