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

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

ネットワーク構造の自動最適化機能を試してみる(その2)/使い方34/Neural Network Console

Neural Network Consoleのネットワーク構造の自動最適化機能を「とりあえず」試してみました。

arakan-pgm-ai.hatenablog.com

 それで、どんな機能なのかは、なんとなくつかめたので、「とりあえずやった時の反省点」を踏まえて、もう一回チャレンジしてみようというのが、今回の趣旨です。

 

まずは前回の反省点のおさらいから

 

前回の反省点は、以下の2点です。

  • Epoch数は多めにしておく必要がある。
  • Time Limitは指定しない方がよいかもしれない。

Epoch数が10回だと「学習の途中でぶちきられた」感じで収束できていないグラフになっているのが多かった。 

あと、学習の進み具合に問題はないのに、途中で終わった・・つまり時間で打ち切られたっぽい・・もあった。 

この2点が理由です。 

 

Epoch数を50にして、Time Limitなしでやってみる

 

変更したConfigタブはこんな感じです。

f:id:arakan_no_boku:20180412002000j:plain

 

前回から変更したのは赤枠の部分。 

Max Epochは 10 から、一気に50にしてみます。 

あと、ValidationのMaxのところを、リファレンスを参考にした0.05から、0.2に変更しています。 

これは0.05だと、学習の最初(1Epoch目)でしきい値を超えて、打ち切られてしまっていたグラフが結構あり、50パターンもできていたのに、最後まで学習がすすんでいたものが半分くらいしかなかったので、ちょっと緩めてみたということです。 

あと、Time Limitを空白にしてます。 

これで時間はかかるかもしれませんが、学習が途中経過で止まるということはなくなるはずです。

 

再び一晩中(今度は8時間)動かし続けてみる

 

寝る前に学習を開始しました。 

前回よりちょっと早めの時刻にして、8時間動かしてみます。 

結果として、できていたのは7パターン。 

最後は出勤時刻になったのでストップしましたが、他のパターンはすべて学習が最後まで終わってます。 

せっかくなので、ネットワーク構造が自動最適化機能によって、どんな風に変更されていったのかを時系列にのせてみます。 

まず、元々のLeNetです。

f:id:arakan_no_boku:20180410214550p:plain

いきなり、レイヤーが変更されてます。

3つめのReLuがELU。

4つめのMaxPoolingがAveragePoolingに変わってます。

f:id:arakan_no_boku:20180412193615p:plain

 

ところが、以降はレイヤーの入れ替えはありません。 

レイヤーの構成は同じで、各Outputパラメータの値が微妙に変わっていきます。 

Convolution、16.22.22から、16.25.24になり、以降がそれにあわせて調整されてます。 

結果的にこれが自動最適化された中では一番精度がよかったものです。

f:id:arakan_no_boku:20180412193752p:plain

同様に、16.25.24から16.28.22になってます。

f:id:arakan_no_boku:20180412194135p:plain

今度は、16.28.22から6.28.22になってます。

f:id:arakan_no_boku:20180412194343p:plain

今度はConvolutionのOutputは変わらずに、ELUの後続の、AveragePoolingのShapeが、6.9.7から、6.7.5になってます。

f:id:arakan_no_boku:20180412194440p:plain

最後のものは、CovolutionのOutputが、6.28.22から3.28.22になってます。

f:id:arakan_no_boku:20180412194520p:plain

 

面白いです。 

こういう調整の仕方をするんですねえ。

 

結果的にはベンチマークに勝てたものはなかったですが

 

サンプルで用意されたLeNet.sdcprjとMNISTをそのままデフォルトのハイパーパラメータで学習・評価した結果である以下がベンチマークです。 

かつ、Epoch数が10と少なめでもあります。

f:id:arakan_no_boku:20180409232111j:plain

 

そして、以下が今回自動最適化で生成されたネットワーク構造でもっとも成績のよかったものです。

f:id:arakan_no_boku:20180412004022j:plain

 

結局、ベンチマークは超えられませんでした。 

でも、これはサンプルプロジェクトで用意されているものは、最適化された上で、もっともよい精度が期待できるネットワーク構造が選ばれてるんだなということが再確認できたというだけのことです。 

この自動最適化機能の便利さをスポイルするものではありません。 

実際には、自分で設計したネットワーク構造でやりますものね。 

ある程度まで絞り込んだら、この自動最適化機能にかけて、もっと効率のよいネットワーク構造がないかどうかをチェックする。 

それで、今回のLeNetみたいに、ベンチマークを超えるものがでなかったら、その条件下では最善とみなすことができる。 

こういうアプローチでネットワーク構造の検証ができるということですから。 

それに、自動最適化機能が生成したものを眺めていると、いろいろなレイヤーの使い方の勉強にもなりますし。 

これは、結構、使うでしょうね。 

たぶん。 

f:id:arakan_no_boku:20171115215731j:plain