下記の記事で、順伝播型ニューラルネットワークによる手書き画像を扱って予測を行いました。
Tensorfrowで画像分類など学習してみる(手書き文字認識編1)
Tensorfrowで画像分類など学習してみる(手書き文字認識編2)
Tensorfrowで画像分類など学習してみる(手書き文字認識編3)
この記事では畳み込みニューラルネットワークCNN(Convolutional Neural Network)、を使って画像の分類をしてみます。CNNは1980年台に考え方があり、1990年台にLeNetというモデルが考えられました。
##CNNモデルの背景
順伝播型ニューラルネットワークでも画像を取り扱うことはできましたが、処理の中で2次元の行列データを1次元のデータに変換して扱っていましたがこの中で画像の持つ情報が損なわれるということがあり考えられたのがCNNです。
順伝播型ニューラルネットワークの記事では、MNISTの手書き文字セットを扱いましたが、28×28のモノクロ画像でした。この画像を784の一次元の行列に変換して処理しました。具体的には
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
#変換後の構造を確認する。
print('x_train.shape:', x_train.shape)
print('x_test.shape:', x_test.shape)
というコードを書いて変換していました。
画像自体は2次元で表現された場合、被写体の縦・横など位置情報も持っているはずですが、1次元にするとそれが失われるということで、2次元で扱うことができればそれらの情報も保持できます(もっと言えばカラー画像であれば色情報もあるので3次元にもなります)
##CNNの構成(概略)
CNNの概要を記載します。C様々途中に活性化関数、最適化手法を組み合わせるなど進化していますが、ここでは大まかな概要をまずはつかみたいと思います。CNNは畳み込み層とプーリング層を重ね、最終的に全結合層と出力層を重ねていく手法です。
###畳み込み層
畳み込み層は画像に対してカーネル(フィルタ)を重ね計算し画像の特徴量を得るためのものです。このフィルタを用いて実際の画像から特徴マップを作ります。
CNNではフィルタの値により特徴マップとして得られる値が異なるので、フィルタの値が重みとなり最適化するパラメーターともなります。
###プーリング層
特徴マップに対して決められた計算を行い小さくする処理です。この処理をダウンサンプリングまたは単にサンプリングといいます。プーリング層での計算は主に2種類があり、最大値をとるMAXプーリングと平均値をとるAvgプーリングがあります。プーリング層では計算のみを行い学習するべきパラメーターはありません。
###全結合層・出力層
全結合層では畳み込み層とプーリング層で得られた結果の多次元配列を1次元の状態に戻し、最終的に分類ができる形にします。この処理は順伝播型ニューラルネットワークでも最終的に1次元にしsoftmax関数で多クラスに分類した処理と同義のものです。
まとめ
概要をつかみどんな層が必要かを見てきました。次回以降はそれぞれの層をTensorFlowとkerasを使って実装していきたいと思います。