"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

MeanSubtractionレイヤーのCNNの認識精度向上効果を試す/Neural Network Consoleの使い方

今回は、画像認識の前処理として使うと精度向上の効果がある「MeanSubtraction」というレイヤーを試してみます。

f:id:arakan_no_boku:20190326212937j:plain

2017/12/02追記

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

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

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

 

MeanSubtraction

 

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

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

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

ほほう!。 

なかなか魅力的な文言です。 

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

 

 

MeanSubtractionのみの出力を確認

 

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

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

f:id:arakan_no_boku:20170922201532j:plain

 

EDITタブ

 

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

  • input
  • MeanSubtraction
  • AquaredError

の順です。

f:id:arakan_no_boku:20170907233807j:plain

 

MeanSubtractionのパラメータ

 

ここで、「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にMeanSubtractionを適用する 

 

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

 

ベースにするCNNは、以前に学習用に作ったものを使います。 

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

arakan-pgm-ai.hatenablog.com

 

arakan-pgm-ai.hatenablog.com

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

f:id:arakan_no_boku:20170908220027j:plain

 

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

 

MeanSubtractionのパラメータを変更

 

そのうえで、「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

 

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

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

f:id:arakan_no_boku:20170908230501j:plain

 

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

評価結果です。

f:id:arakan_no_boku:20170908230621j:plain

 

99.20%ですか。 

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

 

mean.initializerMu 」0.3

 

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

学習結果です。

f:id:arakan_no_boku:20170908230836j:plain

 

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

評価結果です。

f:id:arakan_no_boku:20170908231003j:plain

 

98.86%ですか。 

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

 

mean.initializerMu 」0.22

こうやってみると、勘でセットした最初の「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

 

では、こんどは、「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 がベストなようですね。 

もちろん、上記のCNNに適用した場合は・・なんでしょうけど。

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

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

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

面白いですねえ。

 

2017/12/02追記

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

f:id:arakan_no_boku:20171130202351j:plain