E資格に向けての勉強(CNN)
Convolutional Neural Network
日本語では畳み込みニューラルネットワーク。
主に画像分類、特に一般物体認識に使用される。
従来の全結合層や活性化関数に、畳み込み層とプーリング層を加えたもの。
- ハイパーパラメータ
チャネル数
白黒画像なら1、カラー画像なら3(R, G, B)。
input_shape=(縦ピクセル数, 横ピクセル数, チャネル数)
カーネルサイズ
縦横のピクセル数を指定する。
通常は正方形が利用される。
kernel_size=(x, y)
ストライド
入力とカーネルの積をとって特徴を探す際のカーネルを移動させるピクセル数。
strides=(x, y)
パディング
画像サイズ縮小を防ぐための補完。
sameかvalidが通常使用される。
padding='same' or padding='valid'
- 畳み込み層の役割
特徴をより際立たせて抽出する。
演算結果は特徴マップへ。
(3, 3)のkernel_sizeに(2, 2)のstridesを使うと、5*7の入力層(実際はゼロパディングで7*9)は3*4に次元削減される。
- プーリング層の役割
特徴を押さえたまま画像を縮小する。
平均値プーリング層と最大値プーリング層があるが、基本的に後者を用いる。
- 流れ
畳み込み→プーリング→畳み込み→プーリング→畳み込み→プーリング→平滑化(Flatten)→全結合(Dense)→活性化関数(Activation)と言った感じの流れになる。
Kerasのコードは下記のような感じ。
# Sequentialモデル model = Sequential() # 畳み込み層 # カーネルサイズが(3,3)の出力フィルタが32枚、、ストライドは(1,1)、sameパディング、活性化関数はrelu、入力画像が100×100でカラー model.add(Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu', input_shape=(100, 100, 3))) # プーリング層 # 入力画像の2×2領域で最大の数値を出力する最大値プーリング層 model.add(MaxPooling2D(pool_size=(2, 2))) # 同様に2回 model.add(Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(filters=128, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) # 平滑化 model.add(Flatten()) # 全結合(出力256) model.add(Dense(256, activation='relu')) # 全結合層との繋がりを50%無効化 model.add(Dropout(0.5)) # 全結合(出力10)。10クラス分類の場合は10になる。 model.add(Dense(10, activation='softmax'))
- 有名なCNN
LeNet-5
1998年に開発。
手書き文字認識でよく使われる。
AlexNet
ILSVRC2012で優勝。
過学習抑制のためにDroupoutとData augmentationを行っている。
GoogLeNet
ILSVRC2014で優勝。
インセプションモジュールを採用することで、層を深くしながらも少ない次元、計算量で学習可能に。
VGG16
ILSVRC2014で2位。
畳み込み層13層+全結合層3層なので16。
ResNet
ILSVRC2015で優勝。
152層という深さだが、Skip connectionを取り入れることにより、学習に成功。
YOLO
物体検知タスクで使用。YOLOv3が使われる。
高速だが、画像内のオブジェクト同士が重なっている場合、うまく検出できない場合がある。
最近だとEfficientNetあたりが有名。