今回は、画像認識の前処理として使うと精度向上の効果がある「MeanSubtraction」というレイヤーを試してみます。
2017/12/02追記
>以降の説明の画面はVersion1.00のものです。
>Version1.10で一部アイコンのデザインが変更されています。
>ですが、見てわかる範囲と考えて、貼替え等はしていません。
MeanSubtraction
ニューラルネットワークコンソールのリファレンスに、こんな記述があります。
入力値を平均0に正規化します。
画像認識などにおいて前処理として使用することで精度を向上する効果があります。
ほほう!。
なかなか魅力的な文言です。
これは試してみないといけないですね。
MeanSubtractionのみの出力を確認
まずは、 「MeanSubtraction」の出力を確認してみます。
ニューラルネットワークコンソールを立ち上げて、新規プロジェクトを開きましょう。
EDITタブ
以下のようにレイヤーを配置します。
- input
- MeanSubtraction
- AquaredError
の順です。
MeanSubtractionのパラメータ
ここで、「MeanSubtraction」のパラメータを設定してやります。
デフォルトのままだと、出力にほとんど変化がないみたいなので。
ただ、困ったことに、どのような値が適切なのか?
この情報が全くと言っていいほどありません。
とりあえず、今回はこの一つのパラメータだけをさわることにします。
mean.initializerMu と書かれているものです。
これを、0.0 から、0.2 に変更してみます。
何故、0.2・・なのか?
色々、数字を変えて試してみて、一番結果が良さげだったからです。
ちなみに、ここを1.0にすると、画像がすべて消えてしまい真っ黒なだけの画像になってしまいますし、0.0だと何も変化しません。
とりあえず、学習して、評価します。
変更前と変更後の比較
変更前と変更後を比較してみます。
確かに、なんとなく色が濃くなって、ペタっとした感じがします。
これが、学習の精度に本当に影響があるのでしょうか?
やってみましょう。
CNNにMeanSubtractionを適用する
ベースにするCNNを準備する
ベースにするCNNは、以前に学習用に作ったものを使います。
ベースにするのは、「使い方5」「使い方6」で説明しているものです。
上記の「使い方5」と「使い方6」で組んだCNNのinputの下に、「MeanSubtraction」を差し込んで、Shift+クリックで線でつないで、以下のようなネットワークを組んでください。
新規プロジェクトにした方は、上記をドロップして作成してくださいね。
MeanSubtractionのパラメータを変更
そのうえで、「MeanSubtraction」のパラメータを変更します。
mean.initializerMu を、0.0 から、0.2 に変更するだけです。
学習の実行
このまま学習をしてみます。
学習の進み方は、「MeanSubtraction」を追加する前と、スピード的にはあまり変わりません。
前に過学習の抑制のために、「DropOut」とか「BatchNormlization」を追加した時は、相当学習時間が長くなったので、それと同じような感じかと思っていたんですけど、想像とだいぶ違いました。
学習曲線も、「MeanSubtraction」を追加する前と、あまり変わりませんね。
評価の実行
それでは評価してみます。
今までところ、あまり変化がないので期待薄かもしれないのですが。
結果を見てみます。
あれ! 99.43%!!
精度が0.2%以上もあがってます。
99%を越えてからは、なかなか上がらないので、これは中々の結果です。
この「MeanSubtraction」の効果・・侮れないですね。
こうなると、パラメータの値を変化させてみたら、もっと、精度があがるかもしれないという期待も持てます。
せっかく、気楽に試せる環境があるんですから、やってみましょう。
MeanSubtractionのパラメータを変化させて、精度向上を試みる
試してみると言っても、あまり、無計画にあれこれ触ると、わけがわからなくなるので、「mean.initializerMu 」のみを変化させて、精度の変化を見ることにします。
mean.initializerMu 」を0.1
まず、「mean.initializerMu 」を0.1に下げてみました。
学習の結果はこんな感じ。
あまり、変わらないですね。
評価結果です。
99.20%ですか。
さっきよりは下がりました。
mean.initializerMu 」0.3
今度は、「mean.initializerMu 」を0.3に上げてみます。
学習結果です。
ちょっとバラツキ感がでてきました。
評価結果です。
98.86%ですか。
ずいぶん、下がりましたね。
mean.initializerMu 」0.22
こうやってみると、勘でセットした最初の「0.2」という値は、良いところをついてたみたいです。
では、それを元に、0.02刻みくらいで、微妙に変化をつけてみます。
まず、0.22 という数字にしてみます。
学習結果です。
評価結果です。
99.43%!
トップタイですね。
0.2 ~ 0.22 の幅では、精度はあがらないけど、維持できてるみたいです。
mean.initializerMu 」0.18
では、こんどは、「mean.initializerMu 」を0.18 にしてみます。
学習結果はこんな感じ。
評価結果はどうかな。
あちゃあ。
98.86%です。
まとめ
ということで。
上記の結果を見る限り「MeanSubtraction」の「mean.initializerMu 」の値は、0.2 がベストなようですね。
もちろん、上記のCNNに適用した場合は・・なんでしょうけど。
いやあ、微妙なもんですね。
こんな感じで、パラメータをいじっているだけでも、かなり遊べますし、ニューラルネットワークで最高の結果を出すために、どんなに地道な努力が必要かもわかります。
ニューラルネットワークコンソール。
面白いですねえ。
2017/12/02追記
Version1.10でアイコンのデザインが変更になった主な部分はこちらです。