今回は「BatchNormalization」を学習精度向上に効果があるか試してみます。
過学習抑制に関して一度使いましたが、それだけではないよ・・ということなので。
BatchNormalization
レイヤーリファレンスに精度向上のことが書いてあります。
引用してみますね。
入力値を平均0分散1に正規化します。
ConvolutionやAffineの後に挿入することで精度向上、および収束を早める効果があります。
これは、「BatchNormalization」の説明です。
これを頼りに、試してみます。
BatchNormalization の出力を視覚化する
ニューラルネットワークコンソール(Neural Network Console)を起動します。
まず、事前に「BatchNormalization」の出力が、どうなるのかを確認してみます。
前に処理結果の出力を確認する方法をやりました。
同じやり方、(inputとsquaredErrorの間に挟み込んで、MaxPoolingを0にする)で確認できます。
上記記事の「ImageAugmentation」を「BatchNormalization」に置き換えればいいわけですね。
結果はこんな感じ。
なかなか、激しいです。
人間の感覚だと・・これで精度があがるってのがピンときませんね。
CNNに組み込んで効果を試す
ベースになるシンプルなCNNを組んでみます。
ベースになるCNNは過去記事を参考に
ベースにするのは、例によって「使い方5」「使い方6」で説明しているものです。
これに、「BatchNormalization」を組み込んでいくわけです。
BatchNormalizationは、ConvolutionやAffineの後に挿入するのが普通です。
でも、せっかくなのでちょっと置き場所をいろいろ変えて試してみます。
BatchNormalizationを、inputの直後においてみる
試しにinputの直後におきます。
こんなん見たことないですけど・・おもしろいので。
さて、こんな感じでinputの直後に置くと、この出力が「convolution」の入力になるわけですよね・・・大丈夫かな。
この構成で、データはMNISTではなくて、前につかったオリジナルのアルファベットの独自データをDATASETにしてやってみます。
別にMNISTのままでも全然いいです。
けど、以下の結果とはちょっと変わるかもしれませんので、ご容赦ください。
上記の構成で学習してみた結果がこちらです。
最後の方で、なんかおかしな動きしてますが、まあまあ、学習はできてるぽいです。
評価結果はこんな感じ。
99,20%・・ということは、変更する前の結果と同じということです。
どうも、悪さもしないが、良くもならない。
あまり、意味がないみたいですね。
BatchNormalizationを、convolutionの直後に動かしてみる
じゃあ、今度は、正規の位置・・つまり、convolutionの直後に動かしてみます。
他の設定はまったく変えずに、学習と評価をやって、どう変わるか見てみます。
学習した結果はこちら。
かなりきれいな学習曲線になりました。
ちょっと、期待できそうです。
でもって、評価した結果がこちら。
おお!・・99.31%になった。
リファレンスの
ConvolutionやAffineの後に挿入することで精度向上、および収束を早める効果があります。
は、本当なんだなあ・・と実感できますね。
調子にのって、DropOutを追加して、さらなる向上を狙ってみる。
こうなると、「DropOut」を組み合わせるとどうなるか?
興味がでてきます。
ここで、inputの直後にDropOutを挿入してやってみましょう。
設定はデフォルトのままでさわらないことにします。
さきほどの、99.31%の構成にDropOutが加わっただけですね。
これで、学習と評価をやってみます。
学習結果はこちら。
うーん。なんとなく、学習が収束していない(終わってない)感じがしますね。
DropOutをはさむと、やっぱり学習に必要なEpoch数が増えてしまうみたいです。
案の定、評価結果もこんな感じ。
学習が途中で終わってしまったぜ・・感、満載ですね。
Max Epoch を200に変更して再挑戦
じゃあ、しょうがないから、CONFIGタブで、Max Epoch を倍の200にしてみます。
これで、再度学習と評価をしてみます。
学習結果は、こんな感じ。
うーん。学習が進んでるかどうか微妙ですね。
で、評価結果。
98.06%・・変わらないですね。
本日の結論
過学習抑制で利用した「BatchNormalization」が、精度を向上させる効果もあるというのが本当だ・・ということが確認できました。
最後の「DropOut」を追加したのは余計でしたけど、まあ、こういうやり方で使うのはよろしくない・・のがわかったので良いかな。
でも、本を読んで概念的なものを理解するだけより、実際にためして、感覚的につかんでいるのは応用を考える時の引き出しが増えます。
だから、時間がある時に、いろいろ試すのは面白いですね。
ではでは。