画像向けの畳み込み層

PyTorch で学ぶ画像向け Deep Learning

Michal Oleszak

Machine Learning Engineer

画像向けの畳み込み層

  • 画像データに畳み込み層を適用
  • 畳み込み層へアクセス・追加
  • 畳み込みブロックを作成

 

  • 特定タスク向けにモデルを調整

猫の周りのボックス

PyTorch で学ぶ画像向け Deep Learning

Conv2d:入力チャネル

RGB チャネル

  • グレースケール画像: in_channels=1
  • RGB 画像(赤・緑・青): in_channels=3
  • 透過を含む場合(アルファ): in_channels=4
from torchvision.transforms import functional
image = PIL.Image.open("dog.png")
num_channels = functional.get_image_num_channels(image)
print("Number of channels: ", num_channels)
Number of channels: 3
PyTorch で学ぶ画像向け Deep Learning

Conv2d:カーネル

フィルタ

                                        入力テンソル               カーネル       出力テンソル(特徴マップ)

  • カーネル(緑)が画像の左上から右へ、上から下へ移動します$^1$
1 Thevenot, Axel. 2020. A visual and mathematical explanation of the 2D convolution layer.
PyTorch で学ぶ画像向け Deep Learning

カーネルサイズ

行列計算

  • 一般的なカーネルサイズ: 3x3(Conv2d)、2x2(MaxPool2d)
  • 畳み込みはカーネル(緑)と画像領域(ピンク)のドット積
  • ドット積の総和が特徴マップ(青)を生成
PyTorch で学ぶ画像向け Deep Learning

カーネルはフィルタ

  • 画像パターンを抽出

領域フィルタ

線フィルタ

PyTorch で学ぶ画像向け Deep Learning

Conv2d:出力チャネル

出力チャネル                                             入力チャネル      カーネルフィルタ     出力チャネル

  • 出力チャネル数は適用するフィルタ数を決めます
  • 各出力チャネルは別個のフィルタに対応
  • 出力チャネルを増やすと、より複雑な特徴を学習可能
  • 出力チャネル数は2のべき乗(16, 32, 64, 128)が一般的
    • 後段でのチャネルの結合・分割が容易になります
PyTorch で学ぶ画像向け Deep Learning

畳み込み層を追加する

import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)
model = Net()

model.add_module('conv2', conv2)
PyTorch で学ぶ画像向け Deep Learning

畳み込み層へアクセスする

print(model)
Net(
  (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
model.conv2
Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
PyTorch で学ぶ画像向け Deep Learning

畳み込みブロックの作成

  • nn.Sequential()で畳み込み層をブロック化して積み重ねる
class BinaryImageClassification(nn.Module):
    def __init__(self):
        super(BinaryImageClassification, self).__init__()

self.conv_block = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) )
def forward(self, x): x = self.conv_block(x)
PyTorch で学ぶ画像向け Deep Learning

練習してみましょう!

PyTorch で学ぶ画像向け Deep Learning

Preparing Video For Download...