こんにちは、ニューラルネット老人こと糟谷勇児です。
在宅勤務になって通勤時間が減り、このブログにさける時間が増えるかと思いきや、
朝は子供を40分かけて幼稚園に送っていき、夜は子供を寝かしつけるのでニューラルネットをやる時間が激減しました。
とはいえ今回も頑張ってアップしていきます。
ソースコードはこちらです。
github.com
前回のConvNetはプロジェクトごとそのまま残しつつ、今回はFastConvNetというプロジェクトを新たに追加しました。
コンボリューショナルネットのコードをちらっと見たいならConvNet、高速化してVGGとかやりたいならFastConvNetを見るという使い分けをイメージしています。
FastConvNetはConvNetとベースは変わらず、SIMDを使って高速化を施したコンボリューション層が新たに実装されています。
SIMDは4回の計算を一度にやってくれるのですが単精度(float)しか扱えず、倍精度(double)から変換が必要になります。全部の工程を単精度でやる方法もあるのですが、単精度でやる層は別クラスにして前後で変換するようにしています。
詳しくはこちらを参照ください。
buildersbox.corp-sansan.com
また、学習データ単位で並列化していて、一つのニューラルネットを複数のニューラルネットに複製して、それぞれで学習して、結果を寄せ集める方式を取っています。そのため、各層にCopyとMergeDeltaWeightsのメソッドが追加されています。
並列化についてはこちらを参照ください。
buildersbox.corp-sansan.com
さらに、活性化層やソフトマックス層も使えるようになっているのでVGGのアーキテクチャを再現することができます。以前作ったシンプルなVGGで実験してみます。VGGについてはこちらを参照ください。
buildersbox.corp-sansan.com
シンプルなVGG([コンボリューション層+活性化層+Maxプーリング層]×3回、全結合層2回、SoftMax層1回)を使うと、前回と同じKuzushiji-MNISTで85.3%の精度になり、LeNetの時より5pt上がりました。またこれまで、学習データを4000件(各クラス400件)しか使用していなかったので、これを20000件にすると、さらに精度は上がって93.5%になりました。
学習は正しくできていそうですね。もしよろしければGitHubのほうにいろいろコメントいただければとおもいます。