Convolutional neural network(CNN):畳み込みニューラルネットワークを実装したMNIST推計分類をします。CNNの各レーヤについては前回の記事 CNNクラス (CNNの作成) (Deep Learning step XIII) で実装可能になオブジェクトクラスが出来ています。CNNでの処理後に行う全結合ネットワークは 2つ前の記事 誤差逆伝播法[backpropagation]による高速化 (Deep Learning step XII) での実装が出来ています。 今回は、それらを統合してMNISTの文字認識の最終版となります。今回のプログラム構成はメインプログラムと、オブジェクトクラスの幾つかのモジュールに分けています。オブジェクト生成するモジュールとしては、①MNISTデータの読み込みと学習及び確認のためのバッチデータのオブジェクト ②ニューラルネットワークレーヤのオブジェクト ③グラフをプロット出力するオブジェクト を生成するクラスとなります。
【1】 メインプログラム
メインプログラムでは、基本的な処理フローとして、1)パケージのインポート 2) MNIST データの読み込み 3)学習パラメータの設定 4)ニュラルネットワーク構成 5)反復学習の実施と進捗度合いのプロット となります。
【2】 MNIST の読み込みとバッチデータ生成モジュール
MNIST学習用の6万件手書きデータと、確認用の1万件の手書きデータを読み込むオブジェクトを生成します。オブジェクトの生成時にイメージデータとラベルデータは読み込まれます。学習用と確認用のそれぞれで、バッチのデータ数を引数として、ランダムなバッチとラベルのデータセットを戻すインスタンスメソッドを用意します。
XIV_MNIST_data モジュール
【3】 ニューラルネットワークレーヤのモジュール
ニューラルネットワークを構成するレーヤオブジェクトを生成するクラスのモジュールです。切り出し(quarry)、フィルタ(filter)、フィルタバイアス(f_bias)、パディング(padding)、プーリング(pooling)、CNN からFullyに変換(fully)、ReLU関数(relu)、重み付き関数(inter)、バイアス関数(bias)、シグモイド関数(sigmoid)、ソフトマックス関数(softmax)、相互エントロピーエラー関数(c_error)、平均(ave) の関数をオブジェクトにしました。CNN からFullyネットワークに変換(fully)、ReLU関数(relu) はここまでの記事では実装していませんでしたので、新たに作っています。 各レーヤクラスには、基本的に オブジェクト生成(__init__)と、出力の配列(out_s)、順方向処理(forward)、逆方向偏微分計算(backward)、パラメータの更新(update)のメソッドを作っています。
XIV_neural_layer モジュール
【4】 グラフをプロット出力するモジュール
グラフ描画のクラスモジュールです。学習中のerror、テストデータによる認識度の確認でのerrorと正答率をグラフにします。最後に、ニューラルネットワークの設定をテキストプロットしています。
XIV_figs_plot モジュール
【5】 実行結果
実行結果です。 設定したパラメータの初期値はプロット内に表示させています。
Fig_1 CNNを実装したニューラルネットワークでのMNIST認識
この場合 500回、約30秒で96%程度の正答率を得ることが出来ました。フィルタサイズやバッチサイズ、学習効率など、初期設定するパラメータも多く、適当な初期設計が必要なようです。
多くのパラメータを試行して、学習時間もかけると、99%台に到達します。 前々回のMNIST認識のプログラムで使用した、MNIST イメージと推定結果をプロットするプログラムを少し変更して、認識できなかったイメージだけを表示したのが次です。
Fig_2 2万回学習による99%認識と、誤認識イメージ
なかなか癖の強い字(癖数字かな)を書く人がいます。 これらのイメージは学習には使っていません。やはり、見たことのない癖数字は間違えるもなのかもしれません。
【6】その他の実装
ここまででディープラーニングについての体験的な学習は終了することになります。この学習では、基本テキストとして書籍「ゼロから作るDeepLearning」を使用してきましたが、いくつもの項目について省略しています。実装省略した項目を紹介して於きます。
1)活性関数 活性関数はいろいろなものがあるようです。どれがどのような学習に適しているのかはよく分かりません。 この学習のはじめではシグモイド関数を採用しましたが、最後にはReLU関数も実装しています。CNNにはReLU関数、全結合にはシグモイド関数がいいのかなという感覚で実装しています。そして、ステップ関数は実装しませんでした。 この段階では、活性関数はまだ発展途上中で、決定打がないように思われます。(最近の情報ではありません。)
2)エポック(epoch) 学習データを何回相当使ったかの単位。MNISTの学習データは6万個なので、バッチ数×学習回数/6万 がMNISTのエポック数となる。ニューラルネットワークの学習効率を示す指標となるが、私的には計算効率の方が実用的だと思ったので実装・評価しませんでした。最後の99%の認識は60×2万/6万で60エポックである。
3)計算グラフ 連鎖率の逆伝搬を説明して理解する方法です。しかし、この学習では計算グラフ使用しませんでした。従来からの連鎖率(合成関数の微分)を計算式に使用しました。合成関数の微分式にまだ慣れていないなら計算グラフへの乗り換えもあるかもしれません。ただ、計算グラフの他への展開については分からなかったのも理由で、避けました。
4)パラメータの更新 この学習ではパラメータ更新はSDG:確率的勾配降下法だけでした。他に、Momentum、AdaGrad、Adamなどの更新方法があるということです。これらの方法は適切に適用すると早い収束結果を得られるようになります。いくつかの更新方法の実装をしたのですが、これにも適切な初期パラメータの設定が必要でした。ニューラルネットワーク学習の初級としては、基本的なパラメータの最適化も出来ていないので、パラメータ更新方法の評価は次のことと思われたので、紹介からは省略しました。
5)重みの初期値、Batch Normalization、正規化 これらの重要な技術として紹介をされていますが、まだ発展途上の先端技術ということです。重み初期値を0にしない方がよいという点だけは取り入れていますが、その他は実装による大幅な改善が在るとは思われなかったので、実装検証は省略しました。
6)CNN多層化 CNNを多層化するとエポック数での学習効率は上がると思われ、今回の記事のプログラムではCNNの多層化は割と簡単にできると思います。しかし、多層化による処理時間の延長も発生します。非力な自宅PCでの実装には不向きの様でした。
【 最終回あとがき 】
ニューラルネットワークによるデープラーニングはこれで一応の終了です。 テキスト「ゼロから作るDeepLearning」の主要な内容をほぼ終えて、入門段階が終了といえます。 しかし、先端技術からは既に10年近くの遅れです。今や、チャットGTPが普及し始めて、GPU供給するのNVIDIAが業界のトップに飛躍しています。フェイク映像が社会問題ともなっています。 個人の趣味的なレベルとしては、実用に向けたデープラーニングの展開が出来れればという程度です。AIの発展速度は個人的な学習速度よりも早く発展しているようで、その差は開いていくばかりにも思えます。
2024年4月1日 公開
*🐭*🐍*🐭*🐍*🐭*🐍*🐭*🐍*🐭*
0コメント