今や、画像認識ではCNN(Convolutional Neural Network:畳み込みニューラルネットワーク)を使うのが当然のようになってます。
この畳み込みニューラルネットワークを発明したのは、Yann LeCun先生です。
Object Recognition with Gradient-Based Learning(勾配ベース学習による物体認識)という論文に、その原型が書かれているわけですが、なんというか、今のディープラーニングブームのまさに先駆けですよね。
この論文に超有名なこの図が書かれてます。
これが、LeNet-5(5層構造なので)です。
この「ニューラルネットワークコンソールの使い方」でも、最低限の要素で「なんちゃってCNN」的なものを組んで、色々とお試しをしてますけど、こういう本格的なものはどう違うんだろうか?と、ちょっと思います。
ということで、試してみます。
何も悩む必要はなく、サンプルプロジェクトとして用意してありますからね。
LeNet.sdcproj がそうです。
2017/12/02追記
>以降の説明の画面はVersion1.00のものです。
>Version1.10で一部アイコンのデザインが変更になっています。
>ですが、見てわかる範囲と判断して、特に画像の貼り替えはしてません。
早速、LeNetを動かしてみる
まず、最初にお断りしておくと、このサンプルはフルのMNIST(60000枚の学習データ、10000枚のテストデータ)を使うので、CPUオンリーでは結構時間がかかります。
それもあって、MaxEpochは10と少ない回数にしてありますけどね。
なので、とりあえず動かして結果を見たいだけなら、この記事の後ろのほうに動かした結果のハードコピーをつけているので、それを見るだけでもいいかもです。
さて、ニューラルネットワークコンソールを立ち上げます。
プロジェクトの一覧から、LeNet.sdcprojを選んで開きます。
開くとこんな感じです。(ハードコピーの都合で下の方をちょっと横にずらしてます)
よく見ると興味深いところがたくさんありますね。
2階層の並びが、Convolution → MaxPooling → Tanh の順だったり・・。
あ、ちなみにTanhというのは、ハイポリックタンジェントといいます。
グラフの形にすると、Sigmoidにちょっと似てます。
だから、資料とか見ていると、「SigmoidまたはTanhを活性化関数としてよく使います」みたいに、並べて書いてあることが多いですね。
学習と評価をやってみる。(Epoch=10)
さて、本題に戻ります。
とりあえず、何も変えないで学習をします。
学習結果はこんな感じ。
なんか、10Epochだと、途中で学習が終わった感が半端ないですね。
次に評価をします。
結果はこんな感じです。
いい結果ですけどね、Epoch数を増やすと、もっと改善できそうなのでやってみます。
もう一回、学習と評価をやってみる(Epoch=30)
Epoch数を30にしてみます。
上書き保存して学習した結果がこちらです。
なんとなく、20Epochくらいで収束したようなグラフにはなってますね。
評価の結果はこちらです。
99.04%
いい感じです。
黎明期のCNN・・みたいないかにも古い的な修飾子をつけて言われることの多いLeNetですけど、MINISTでなら十分な性能をもっているのがよくわかります。
これに、例えば「BatchNormarization」とかみたいな精度向上策を加えていけば、たぶん、99.5%近くまではいくんじゃないですかね。
次はNNablaに連携してみようと考えている
今回は、サンプルを単純に動かして結果を見ただけです。
あまり、工夫もチャレンジもありません^^;。
それで、「なんだ。ブログの記事の回数稼ぎかよ・・」みたいに思われるのもシャクなので、一応言い訳しておきます。
実は、ニューラルネットワークコンソールはNNabla(Neural Network Libraries)の統合開発環境ということですから、ここで設計して、学習したものを、外に持ち出して、NNabla上で推論エンジンとして動かせるだろうと考えてます。
それを試してみるネタとしてLeNetを考えているので、その前フリとして、とりあげて学習させてみたのを記事にしているわけです。
実際にやってみて、割合うまくいきました。
その手順と結果は、こちらを見てください。
関連記事
ニューラルネットワークコンソールの記事一覧はこちらです。
ニューラルネットワークコンソールの本体である深層学習(ディープラーニング)ライブラリのNNabla関連の記事一覧はこちらです。