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

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

CNNの学習精度が向上するMeanSubtractionレイヤー:使い方11/ニューラルネットワークコンソール

ニューラルネットワークコンソールのリファレンスに、こんな記述があります。

 

入力値を平均0に正規化します。

画像認識などにおいて前処理として使用することで精度を向上する効果があります。

 

ほほう!。

 

精度が向上する前処理とは、なかなか魅力的な文言です。

 

この説明の対象は、前回試してみた「ImageAugmentation」ではなく、「MeanSubtraction」というレイヤーです。

 

これは試してみないといけないですね。

 

2017/12/02追記

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

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

>ですが、見てわかる範囲と考えて、貼替え等はしていません。

 

ベースにするCNNを準備する

 

ベースにするCNNは、サンプルで付いているLeNetとかでも良いのですけど、今回は、もっとシンプルに学習用に作ったものでやります。

 

ベースにするのは、「使い方5」で説明しているものです。

arakan-pgm-ai.hatenablog.com

 

上記を元に、「使い方6」で初期値のチューニングをして保存したプロジェクトを、今回のベースにします。 

arakan-pgm-ai.hatenablog.com

 

もっとも、下の説明で実際に組んだハードコピーを貼り付けていますので、それを見て新規プロジェクトでペタペタ作ってもらっても全然構わないのですけれど。

 

MeanSubtractionのみの出力を確認してみる

 

まず、 「MeanSubtraction」の出力を確認してみます。

 

ニューラルネットワークコンソールを立ち上げて、新規プロジェクトを開きましょう。

f:id:arakan_no_boku:20170922201532j:plain

 

前回「ImageAugmentation」をためしたプロジェクトを選択して開いても良いです。

 

で、以下のようにレイヤーを配置します。

  • input
  • MeanSubtraction
  • AquaredError

の順です。

f:id:arakan_no_boku:20170907233807j:plain

 

ここで、「MeanSubtraction」のパラメータを設定してやります。

 

デフォルトのままだと、出力にほとんど変化がないみたいなので。

 

ただ、困ったことに、どのような値が適切なのか?

 

この情報が全くと言っていいほどありません。

 

とりあえず、今回はこの一つのパラメータだけをさわることにします。

f:id:arakan_no_boku:20170908202728j:plain

 

mean.initializerMu と書かれているものです。

 

これを、0.0 から、0.2 に変更してみます。

 

何故、0.2・・なのか?

 

色々、数字を変えて試してみて、一番結果が良さげだったからです。

 

ちなみに、ここを1.0にすると、画像がすべて消えてしまい真っ黒なだけの画像になってしまいますし、0.0だと何も変化しません。

 

とりあえず、学習して、評価します。

f:id:arakan_no_boku:20170908214634j:plain

 

変更前と変更後を比較してみます。

f:id:arakan_no_boku:20170908214910j:plain

 

確かに、なんとなく色が濃くなって、ペタっとした感じがします。

 

これが、学習の精度に本当に影響があるのでしょうか?

 

やってみましょう。

 

CNNに適用して学習精度が向上するかやってみる 

 

上記の「使い方5」と「使い方6」で組んだCNNのinputの下に、「MeanSubtraction」を差し込んで、Shift+クリックで線でつないで、以下のようなネットワークを組んでください。

f:id:arakan_no_boku:20170908220027j:plain

 

新規プロジェクトにした方は、上記をドロップして作成してくださいね。

 

そのうえで、「MeanSubtraction」のパラメータを変更します。

 

mean.initializerMu を、0.0 から、0.2 に変更するだけです。

f:id:arakan_no_boku:20170908220410j:plain

 

このまま学習をしてみます。

f:id:arakan_no_boku:20170908220656j:plain

 

学習の進み方は、「MeanSubtraction」を追加する前と、スピード的にはあまり変わりません。

 

前に過学習の抑制のために、「DropOut」とか「BatchNormlization」を追加した時は、相当学習時間が長くなったので、それと同じような感じかと思っていたんですけど、想像とだいぶ違いました。

 

学習曲線も、「MeanSubtraction」を追加する前と、あまり変わりませんね。

f:id:arakan_no_boku:20170908221128j:plain

 

それでは評価してみます。

f:id:arakan_no_boku:20170908221313j:plain

 

今までところ、あまり変化がないので期待薄かもしれないのですが。

 

結果を見てみます。

f:id:arakan_no_boku:20170908221534j:plain

 

あれ! 99.43%!!

 

精度が0.2%以上もあがってます。

 

99%を越えてからは、なかなか上がらないので、これは中々の結果です。

 

この「MeanSubtraction」の効果・・侮れないですね。

 

こうなると、パラメータの値を変化させてみたら、もっと、精度があがるかもしれないという期待も持てます。

 

せっかく、気楽に試せる環境があるんですから、やってみましょう。

 

MeanSubtractionのパラメータを変化させて、精度向上を試みる

試してみると言っても、あまり、無計画にあれこれ触ると、わけがわからなくなるので、「mean.initializerMu 」のみを変化させて、精度の変化を見ることにします。

 

まず、「mean.initializerMu 」を0.1に下げてみました。

 

学習の結果はこんな感じ。

f:id:arakan_no_boku:20170908230501j:plain

 

あまり、変わらないですね。

 

評価結果です。

f:id:arakan_no_boku:20170908230621j:plain

 

99.20%ですか。

 

さっきよりは下がりました。

 

今度は、「mean.initializerMu 」を0.3に上げてみます。

 

学習結果です。

f:id:arakan_no_boku:20170908230836j:plain

 

ちょっとバラツキ感がでてきました。

 

評価結果です。

f:id:arakan_no_boku:20170908231003j:plain

 

98.86%ですか。

 

ずいぶん、下がりましたね。

 

こうやってみると、勘でセットした最初の「0.2」という値は、良いところをついてたみたいです。

 

では、それを元に、0.02刻みくらいで、微妙に変化をつけてみます。

 

まず、0.22 という数字にしてみます。

 

学習結果です。

f:id:arakan_no_boku:20170908233138j:plain

 

評価結果です。

f:id:arakan_no_boku:20170908233932j:plain

 

99.43%!

 

トップタイですね。

 

0.2 ~ 0.22 の幅では、精度はあがらないけど、維持できてるみたいです。

 

では、こんどは、「mean.initializerMu 」を0.18 にしてみます。

 

学習結果はこんな感じ。

f:id:arakan_no_boku:20170908234345j:plain

 

評価結果はどうかな。

f:id:arakan_no_boku:20170908233834j:plain

 

あちゃあ。

 

98.86%です。

 

ということで、「MeanSubtraction」の「mean.initializerMu 」の値は、0.2 がベストなようですね。

 

いやあ、微妙なもんですね。

 

こんな感じで、パラメータをいじっているだけでも、かなり遊べますし、ニューラルネットワークで最高の結果を出すために、どんなに地道な努力が必要かもわかります。

 

ニューラルネットワークコンソール。

 

面白いですねえ。

 

2017/12/02追記

Version1.10でアイコンのデザインが変更になった主な部分はこちらです。

f:id:arakan_no_boku:20171130202351j:plain

 


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

arakan-pgm-ai.hatenablog.com

f:id:arakan_no_boku:20171115215731j:plain