アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

CNNを発明したLuCun先生のLeNetをためしてみよう:使い方13/ニューラルネットワークコンソール

今や、画像認識ではCNN(Convolutional Neural Network:畳み込みニューラルネットワーク)を使うのが当然のようになってます。 

この畳み込みニューラルネットワークを発明したのは、Yann LeCun先生です。 

Object Recognition with Gradient-Based Learning(勾配ベース学習による物体認識)という論文に、その原型が書かれているわけですが、なんというか、今のディープラーニングブームのまさに先駆けです。 

この論文に超有名なこの図が書かれてます。

f:id:arakan_no_boku:20170923102525j:plain

 

これが、LeNet-5(5層構造なので)です。 

この「ニューラルネットワークコンソールの使い方」でも、最低限の要素で「なんちゃってCNN」的なものを組んで、色々とお試しをしてますけど、こういう本格的なものはどう違うんだろうか?と、ちょっと思います。 

ということで、試してみます。 

何も悩む必要はなく、サンプルプロジェクトとして用意してありますからね。 

LeNet.sdcproj がそうです。

 

2017/12/02追記

>以降の説明の画面はVersion1.00のものです。

>Version1.10で一部アイコンのデザインが変更になっています。

>ですが、見てわかる範囲と判断して、特に画像の貼り替えはしてません。

 

早速、LeNetを動かしてみる 

 

まず、最初にお断りしておくと、このサンプルはフルのMNIST(60000枚の学習データ、10000枚のテストデータ)を使うので、CPUオンリーでは結構時間がかかります。 

それもあって、デフォルトのMaxEpochは10と少ない回数にしてあります。 

とりあえず動かして結果を見たいだけなら、この記事の後ろのほうに動かした結果のハードコピーをつけているので、それを見るだけでもいいかもです。 

さて、ニューラルネットワークコンソールを立ち上げます。 

プロジェクトの一覧から、LeNet.sdcprojを選んで開きます。  

開くとこんな感じです。(ハードコピーの都合で下の方をちょっと横にずらしてます)

f:id:arakan_no_boku:20170923104435j:plain

 

よく見ると興味深いところがたくさんありますね。 

2階層の並びが、Convolution → MaxPooling → Tanh の順だったり・・。 

あ、ちなみにTanhというのは、ハイポリックタンジェントといいます。 

グラフの形にすると、Sigmoidにちょっと似てます。

f:id:arakan_no_boku:20170923110111j:plain

だから、資料とか見ていると、「SigmoidまたはTanhを活性化関数としてよく使います」みたいに、並べて書いてあることが多いですね。

 

学習と評価をやってみる。(Epoch=10)

 

さて、本題に戻ります。 

とりあえず、何も変えないで学習をします。

f:id:arakan_no_boku:20170923104735j:plain

 

学習結果はこんな感じ。

f:id:arakan_no_boku:20170923125626j:plain

 

なんか、10Epochだと、途中で学習が終わった感が半端ないですね。  

次に評価をします。

f:id:arakan_no_boku:20170923104852j:plain

 

結果はこんな感じです。

f:id:arakan_no_boku:20170923125725j:plain

 

いい結果ですけどね、Epoch数を増やすと、もっと改善できそうなのでやってみます。

 

もう一回、学習と評価をやってみる(Epoch=30)

 

Epoch数を30にしてみます。

f:id:arakan_no_boku:20170923125830j:plain

 

上書き保存して学習した結果がこちらです。

f:id:arakan_no_boku:20170923125916j:plain

 

なんとなく、20Epochくらいで収束したようなグラフにはなってますね。 

評価の結果はこちらです。

f:id:arakan_no_boku:20170923130011j:plain

 

99.04% 

いい感じです。 

黎明期のCNN・・みたいないかにも古い的な修飾子をつけて言われることの多いLeNetですけど、MINISTでなら十分な性能をもっているのがよくわかります。 

これに、例えば「BatchNormarization」とかみたいな精度向上策を加えていけば、たぶん、99.5%近くまではいくんじゃないですかね。

 

次はNNablaに連携してみようと考えている

 

今回は、サンプルを単純に動かして結果を見ただけです。 

あまり、工夫もチャレンジもありません^^;。 

それで、「なんだ。ブログの記事の回数稼ぎかよ・・」みたいに思われるのもシャクなので、一応言い訳しておきます。 

実は、ニューラルネットワークコンソールはNNabla(Neural Network Libraries)の統合開発環境ということですから、ここで設計して、学習したものを、外に持ち出して、NNabla上で推論エンジンとして動かせるだろうと考えてます。 

それを試してみるネタとしてLeNetを考えているので、その前フリとして、とりあげて学習させてみたのを記事にしているわけです。 

実際にやってみて、割合うまくいきました。 

その手順と結果は、こちらを見てください。

arakan-pgm-ai.hatenablog.com 

関連記事

ニューラルネットワークコンソールの記事一覧はこちらです。

arakan-pgm-ai.hatenablog.com

 

ニューラルネットワークコンソールの本体である深層学習(ディープラーニング)ライブラリのNNabla関連の記事一覧はこちらです。

arakan-pgm-ai.hatenablog.com

f:id:arakan_no_boku:20171115215731j:plain