Neural Network ConsoleのStructure Search(ネットワークの自動最適化機能)を試すの2回目をやってみます。
ネットワーク構造自動最適化機能を試してみる(その2)
その(1)の続きです。
それで、どんな機能なのかは、なんとなくつかめたので、「とりあえずやった時の反省点」を踏まえて、もう一回チャレンジしてみようというのが、今回の趣旨です。
前回の反省点は、以下の2点です。
- Epoch数は多めにしておく必要がある。
- Time Limitは指定しない方がよいかもしれない。
Epoch数が10回だと「学習の途中でぶちきられた」感じで収束できていないグラフになっているのが多かった。
あと、学習の進み具合に問題はないのに、途中で終わった・・つまり時間で打ち切られたっぽい・・もあった。
この2点が理由です。
Epoch数を50にして、Time Limitなしでやってみる
変更したConfigタブはこんな感じです。
前回から変更したのは赤枠の部分。
Max Epochは 10 から、一気に50にしてみます。
あと、ValidationのMaxのところを、リファレンスを参考にした0.05から、0.2に変更しています。
これは0.05だと、学習の最初(1Epoch目)でしきい値を超えて、打ち切られてしまっていたグラフが結構あり、50パターンもできていたのに、最後まで学習がすすんでいたものが半分くらいしかなかったので、ちょっと緩めてみたということです。
あと、Time Limitを空白にしてます。
これで時間はかかるかもしれませんが、学習が途中経過で止まるということはなくなるはずです。
再び一晩中(今度は8時間)動かし続けてみる
寝る前に学習を開始しました。
前回よりちょっと早めの時刻にして、8時間動かしてみます。
結果として、できていたのは7パターン。
最後は出勤時刻になったのでストップしましたが、他のパターンはすべて学習が最後まで終わってます。
せっかくなので、ネットワーク構造が自動最適化機能によって、どんな風に変更されていったのかを時系列にのせてみます。
まず、元々のLeNetです。
いきなり、レイヤーが変更されてます。
3つめのReLuがELU。
4つめのMaxPoolingがAveragePoolingに変わってます。
ところが、以降はレイヤーの入れ替えはありません。
Outputパラメータの値が微妙に変化
レイヤーの構成は同じで、各Outputパラメータの値が微妙に変わっていきます。
Convolution、16.22.22から、16.25.24になり、以降がそれにあわせて調整されてます。
結果的にこれが自動最適化された中では一番精度がよかったものです。
同様に、16.25.24から16.28.22になってます。
今度は、16.28.22から6.28.22になってます。
今度はConvolutionのOutputは変わらずに、ELUの後続の、AveragePoolingのShapeが、6.9.7から、6.7.5になってます。
最後のものは、CovolutionのOutputが、6.28.22から3.28.22になってます。
面白いです。
こういう調整の仕方をするんですねえ。
結果的にはベンチマークに勝てたものはなかったですが
サンプルで用意されたLeNet.sdcprjとMNISTをそのままデフォルトのハイパーパラメータで学習・評価した結果である以下がベンチマークです。
かつ、Epoch数が10と少なめでもあります。
そして、以下が今回自動最適化で生成されたネットワーク構造でもっとも成績のよかったものです。
結局、ベンチマークは超えられませんでした。
でも、これはサンプルプロジェクトで用意されているものは、すでに最適化されてるんだなと、再確認できただけのことです。
この自動最適化機能の便利さをスポイルするものではありません。
普通は、自分で設計したネットワーク構造でやりますものね。
ある程度まで絞り込んだら、この自動最適化機能にかけて、もっと効率のよいネットワーク構造がないかどうかをチェックする。
それで、今回のLeNetみたいに、ベンチマークを超えるものがでなかったら、その条件下では最善とみなすことができる。
こういうアプローチでネットワーク構造の検証ができるということですかね。
ではでは。