皆さん
こんにちは、GMOアドマーケティングのS.Rです。
前回は ディープラーニングの要約を皆さんへ紹介しました。今回はパターン認識(画像認識、音声認識など)に一番使われてるモデルの一つ、畳み込みニューラルネットワークを皆さんへ紹介したいと思います。
1. 畳み込みニューラルネットワークとは
機械学習において、畳み込みニューラルネットワーク(たたみこみニューラルネットワーク、英: Convolutional neural network、略称: CNNまたはConvNet)は、順伝播型(英語版)人工ディープニューラルネットワークの一種である。画像や動画認識に広く使われているモデルである(畳み込みニューラルネットワーク、2018年11月24日、ウィキペディア日本語版)。
2006年にHinton先生が畳み込みニューラルネットワークについて画期的な論文(A fast learning algorithm for deep belief nets)を発表したのを皮切りとしてディープラーニングの飛躍期が始まりました。畳み込みニューラルネットワークを使って画像分類、自動運転などに大きな成果となりました。畳み込みニューラルネットワークは将来的に期待できるディープラーニングのモデルと認識しています。 近年畳み込みの計算効率を改良する為に各IT大手企業(Google, Amazonなど)が汎用なチップより百倍くらい早い専用のチップを開発しました。 これらのチップで畳み込みニューラルネットワークの精度はどんどん高くなっています(図1)。
2. 畳み込みの計算
畳み込みの計算(たたみこみ、英: convolution)は関数 g を平行移動しながら関数 f に重ね足し合わせる二項演算です。計算の定義式は下記です。
図2は畳み込みを計算する動画です。
3. 畳み込みニューラルネットワークで解決したい問題
全結合ニューラルネットワークのイメージで、一つのコネクションに対してユニットの関数によって少なくても学習するパラメータが一つあります。例えばある五層の全結合ニューラルネットワークで800*600の写真を認識するモデルを学習します(図3)。想定された結果は4分類があります。(Output Layerのユニット数は4)。このモデルで学習するパラメータ数は3x(800×600)2 + 4 x 800×600 = 69 億(1012)です。この量のパラメータを今の計算力で学習することは無理です。畳み込みニューラルネットワークはこの問題を解決する為に提案された方法です。
4. 全結合ニューラルネットワークから畳み込みニューラルネットワークへ転換
図3の全結合ニューラルネットワークを畳み込みニューラルネットワークへ転換した結果は図4です。
畳み込みニューラルネットワークのモデルで学習するパラメータをコネクションの重みではなくからフィルタになりました。実際の応用には一つ畳み込み層の下に一つMaxpool(Maxpoolの紹介は次項でいたします)層があります。各層で一つのフィルタではなく数百フィルタがあります。例えば先出した畳み込みニューラルネットワークのモデル一つの、畳み込み層で100フィルタがあったら実際の応用でパラメータ数は3400(34 x 100)になります。
5. MaxPooling層
MaxPooling層はConvolutoin層の後に適用される。MaxPoolingの計算の流れは図5です。
入力データをより扱いやすい形に変形するために情報を圧縮し、down samplingする。MaxPoolingと呼ばれる手法では、操作は以下のように小領域に対して、最大のものを選択する操作となる。このように情報を圧縮することで
- 微小な位置変化に対して頑健となります。
- 過学習を抑制します。
- 計算コストを下げます。
といった効果があり、Convolution層とPooling層で特徴を検出する働きをします。
6. Keras版で畳み込みニューラルネットワークを構築
KerasはTensorFlow、Theanoで動くニューラルネットワークライブラリです。Kerasの紹介はこちらに参考してください。
Keras版の畳み込みニューラルネットワークの構築を説明する為に,例として手書き数字の画像を認識するデータセットであるMINISTを分析するCNNモデルを作りましょう。
MINISTのデータセットは7000枚28×28の手書き数字の画像で構成しています。モデルの構成図は図6です。
図6のモデルは4層があります。学習するパラメータの数は下記です。
- 畳み込みニューラルネットワーク層:
フィルタのパラメータ数は3 x 3, Bias項 1 , フィルタが128個あるので CNN1のパラメータ数が(3 x 3 + 1) x 128= 1280です - MaxPool層: 0
- Flatten層:0
- Output層:
Flattenされたニューラルのコネクションが13x13x128 ,Bias項 1個, Outputの ニューラルが10個あるのでOutput層のパラメータ数は(13x13x128 + 1) x 10 = 216330
SUM: 217610
具体的なコードが下記です:
1 LibraryをImport:
1 2 3 |
from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense,MaxPool2D, Dropout, Activation, Input, Embedding, from tensorflow.keras import Input |
2 Modelを作る
1 2 3 4 5 6 |
inputs = Input(shape= (28, 28,1), dtype=tf.float32) output = Conv2D(128, kernel_size=(4, 4), activation='relu', input_shape= (28, 28,1))(inputs) output =MaxPool2D(pool_size=(2, 2))(output) output =Flatten()(output) output = Dense(num_classes, activation='softmax')(output) model = Model(inputs=[inputs], outputs=[output]) |
3 損失関数を定義し、ModelをCompileする
1 |
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) |
4 Modelをfitする
1 |
model.fit(x_,y_, batch_size=1, verbose=1, epochs=10, shuffle=False) |
7. 実行した結果
8. まとめ
今回は畳み込みニューラルネットワークの要約を紹介しました。いかがでしたでしょうか。
実際の機械学習系の業務に畳み込みニューラルネットワークを使う機会はたくさんあります。もし今回のブログが皆さんの畳み込みニューラルネットワークの理解にお役に立てば幸いです。