この記事では畳み込みニューラルネットワーク(CNN)の仕組みと各層の役割について理解したことを個人的にまとめたものです。間違っていたらコメントください(笑)
#畳み込みニューラルネットワーク(CNN)
畳み込みニューラルネットワーク(以降CNN)は入力層、畳み込み層、プーリング層、全結合層、出力層といった入力層の特定ユニットと出力層のユニットが結合されている順伝播型ネットワークです。
各層の役割とpythonでどのように表現されるもなのかをkerasで表現した場合で記載します。
kerasではニューラルネットワークを作成する際にモデル定義にて作成します。各層を追加してモデルを定義していき、最後にコンパイルしてデータを入れていくという仕組みです。
準備:
・kerasのライブラリは下記のようにインポートします。
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
・入力と出力の定義
入力:CNNで学習するデータが入力されます。
例えば画像などを入力データとして扱います。
出力:CNNで学習させたデータの判定が出力されます。
いくつかの判定結果(クラス)を定義し、入力データが
どのクラスに当てはまるか判定して出力します。
#例 サイズが32×32ピクセルのカラー画像を10のクラスどれかに判定する場合
#入力:横と縦をピクセル数(32)でを定義し、カラーはRGBのため3を掛け合わせる
im_rows = 32
im_cols = 32
in_shape = (im_rows, im_cols, 3)
#出力:10クラスなので10と定義する。
num_classes = 10
・畳み込み層
入力データにフィルターをかけて特徴を割り出し、特徴マップを構築します。
この時畳み込み層に入力データをそのまま入れてしまうと出来上がる特徴マップのデータが32×32よりも小さくなってしまうので、特徴マップのサイズを入力サイズと同じにする場合、画像のふちに0をつけるゼロパンディングを行います。
(逆に特徴マップのサイズを小さくする方法もありますが、触れないでおきます。)
# モデルを定義 --- (*3)
model = Sequential()
#入力データを畳み込み層(Conv2D)に入れて特徴マップを作成する。
#padding='same'とすることでふちに0を入れる
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=in_shape))
#何度も畳み込みを行うと誤差が薄まってしまうのでreluという活性化関数を足して、誤差が薄まらないようにする。
model.add(Activation('relu'))
・プーリング層
畳み込み層でできた特徴マップからある領域の代表値を抽出する層です。
プーリング層をつけることにより入力された画像の位置の若干の違いや変化を吸収できます。
#畳み込みした後の特徴を取り出す層(プーリング層)
model.add(MaxPooling2D(pool_size=(2, 2)))
#一定の割合で入力データを0にする関数、下の場合4分の1の割合でランダムに0をセットすることで過学習を防ぎ学習制度を上げます。
model.add(Dropout(0.25))
・全結合層
プーリング層で出力された値を平滑化し、一次元のデータにしたものを取り込んで指定したユニット数に変換する層です。
model.add(Flatten()) #データを一次元化する。
model.add(Dense(512))#全結合層の定義 取り込んだデータを512ユニットにします。
model.add(Activation('relu'))
model.add(Dropout(0.5))
・出力層
全結合層を経由し、各クラスの確率が算出される層です。
model.add(Dense(num_classes))#画像の分類クラス数分のユニットを作ります。
model.add(Activation('softmax'))#クラス分類時の値を1か0かのどっちかにします。
#終わりに
本記事ではCNNの層の役割とpythonで定義する際にどのように書けばいいのかを理解している範囲でまとめてみました。
ニューラルネットワークのサンプルプログラムなどを読んでいくうちにその一行が何の役割を持っているのか忘れてしまった時のための備忘録として投稿します。