uma3blog

気が向いたことを稀になんかいろいろ書きます。

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あたりが有名。