【tiny-dnn】バッチ正規化層(batch normalization layer)を使いたい!
六花です。
前回まで言及はさけてきましたが、ニューラルネットワークについて調べた人ならそこそこの人が目にしたであろう「バッチ正規化層」。
tiny-dnnでも、これを使うことができます。
私はこれを自前で実装するのを断念したのでtiny-dnnを調べ始めました!
■環境
Visual Studio Community 2017
tiny-dnn (2018/12/16ダウンロード)
■tiny-dnnではバッチ正規化層は二層に分かれている
バッチ正規化層はその名の通り、伝播の途中で正規化(標準化)を行う層です。
そして、さらに「y = γx + β」というように線形変換を行います。
tiny-dnnでは、これが二つの層に分離されています。
tiny_dnn::batch_normalization_layer
tiny_dnn::linear_layer
前者が正規化を行う層、後者が線形変換を行う層ですね。
並べて使えばちまたのバッチ正規化層と同様に動作します。
ちなみに、これはtiny-dnnのサイトの掲示板(Issues, Pull requests 英語)で読んだ記憶があるのですが、検索が下手なので見つけられませんでした!(無能)
■batch_normalization_layerは二種類のコンストラクタがある
恐縮ながら意図はわかりませんが、batch_normalization_layerには二種類のコンストラクタがあります。
(全層への参照)と、(入力の要素数, チャンネル数)の二つです。
//ネットワークの構築
tiny_dnn::network<tiny_dnn::sequential> net;
{
net << tiny_dnn::fully_connected_layer(10, 50);
net << tiny_dnn::batch_normalization_layer(*net[net.layer_size()-1]); // 一つ目
net << tiny_dnn::linear_layer(50);
net << tiny_dnn::tanh_layer();
net << tiny_dnn::fully_connected_layer(50, 31);
net << tiny_dnn::batch_normalization_layer(31, 1); // 二つ目
net << tiny_dnn::linear_layer(31);
net << tiny_dnn::softmax_layer();
}
画像認識とか使わない場合はチャンネル数なんて関係ないので一つ目の方法だと思いますが、
なんだか不思議な指定をしないといけません。.at()は用意されてますが[]じゃないとコンパイルが通らないようですね。
二番目の方がすっきりして見えるので、チャンネル数が1でもこっちを使った方が可読性は良いかもしれませんね。
ちなみに、linear_layerの方は、(入出力の要素数)を入れるだけで良いです。
■終わりに
自前のものと違って、誰かが大人数で作っているものというのは(若干)バグの不安が減って安心感がありますね!
もっと流行って、処理速度ももっと早くなってくれたらなぁと思う六花でした。