(第13回)畳み込みニューラルネットワーク

MNISTでは全結合の学習を行っていましたが、28x28を1列に変換しているため、行列の関係性が反映されません。画像の場合は、 縦横の関係性も重要になるので、畳み込みニューラルネットワークを実装した方が画像解析が有利であることが容易に想像できます。

<畳み込み演算>

畳み込み演算について調べます。
簡単に書くと、フィルターのサイズで入力層の積を演算して出力する方法で積和演算と呼ぶそうです。

今回はエクセルでマクロを作成して、入力、フィルタ、出力、パディング、ストライドなどを変更して、確認します。

以下のファイルをダウンロードしてマクロを有効にすると確認できます。
CNN_Macro.xlsm
入力、出力、パディング、ストライドを任意の数値にするとランダムデータを入力に展開して、 計算された結果が出力されます。(マクロは[ctrl+m]で実行されます。
この他にプーリング演算という物があって、決まった領域で、集約します。2X2、3x3、4X4のサイズを集約する場合、 ストライド2、3、4、でプーリングするという設定になり、出力が1個のデータに集約できます。また、Maxプーリングが主に使われていますが、 Averageプーリングも利用することもあります。

<CNN+MNIST>

いままでは28x28=784の一列のデータで機械学習を行いました。しかし、画像は28x28で形成されているので、 上下の関係性が薄くなってしまっていました。CNNを使って機械学習を行う事で、精度の良いモデルができます。
すこし時間がかかりますが、以下のプログラムを実行して、学習をさせると、「params.pkl」というファイルが作られます。 これがCNNで学習したモデルになります。学習前後のモデルの画像や実際に手書きのファイルで認識をさせてみます。
MyProgram_CNN.zip
上のZIPを解凍して、その中にMNISTの展開済みの「mnist.pkl」も同じフォルダに保存します。

実行すると学習が始まりますが、1~2時間程度時間がかかります。時間を短縮したい場合は、データの量を削減すれば、短くなります。

学習が完了したら、手書きファイルを10個用意して「test_〇.png」で保存しておきます。以下のプログラムを実行して、 作成したモデルの情報を確認します。

まずは、学習前後のフィルター(W1)の画像を確認します。5x5の30枚の畳み込み演算のフィルターになっています。 学習前はどれもランダムのような形状ですが、学習後は規則性があり、学習されたような印象があります。

次に、手書きのファイルの認識を確認します。書いた文字と認識した回答があってることがわかります。またその時の最大値も 表示しています。

-------------