はじめに
ディープラーニングのフレームワークの自作をしています。
前回記事 : ディープラーニングのフレームワークの自作
マルチプラットフォームで動作させるのが目標ですが、とりあえずExcelから使えるようにしました。
サンプルアプリとして機械学習ではおなじみのMNISTの手書き数字を認識するプログラムを作りました。
下図のように正解数をグラフにプロットします。
ネットワークの構成は4層の畳み込みニューラルネットワークでC++版とCUDA版があります。
単純な確率的勾配降下法を使い、ドロップアウトや正則化などは未実装です。
正解率は98%くらいです。
全体の構成
以下はフレームワークの全体の流れです。
- レイヤーの順伝播の式を記述します。(全結合 , 畳み込み(CNN) , 再帰型(RNN) , LSTM など)
- 逆伝播の式を数式処理で生成します。
- レイヤーのソースコードを生成します。(順伝播、誤差逆伝播、パラメータ更新)
- 確率的勾配降下法(SGD)などのメインのルーチンを各プログラミング言語で記述します。
3で生成されたC++のソースコードは、mallocなどのメモリー操作やexpなどの数学関数しか使ってないので、色々なプラットフォームに簡単に移植できると思っています。
今回のサンプルアプリではCUDAや**C++**のDLLを.NETのラッパーDLLで包んで、それをExcelのVBAからアクセスします。
確率的勾配降下法(SGD)などのメインの ルーチンはVBAで記述します。
VBAのソースは以下にあります。
http://lkzf.info/mkfn/download/MNIST-VBA.zip
実行の手順
以下はサンプルの実行の手順です。
- 実行用のファイルをダウンロードします。
- .NETとC++のランタイムをインストールします。
- .NETのラッパーDLLをCOMとして登録します。
- Excelで空白のブックを作ります。
- .NETのラッパーDLLの参照設定をします。
- VBAのソースファイルをインポートします。
- イミディエイトウィンドウから実行します。
以下で詳しく手順を説明します。
1.実行用のファイルをダウンロードします。
以下のリンクからZIPファイルをダウンロードして適当なフォルダに解凍します。
32bit版Excel用 : http://lkzf.info/mkfn/download/MNIST32.zip
64bit版Excel用 : http://lkzf.info/mkfn/download/MNIST64.zip
※ OSが64bitでもExcelはデフォルトでは32bit版がインストールされます。
OSが64bitでExcelが32bit版の場合は32bit版Excel用を使ってください。
※ 32bit版のCUDAはありませんので、CUDAが使えるPCでは64bit版のExcelがおすすめです。
2..NETとC++のランタイムをインストールします。
.NET Framework 4.5.2
https://www.microsoft.com/ja-JP/download/details.aspx?id=42643
Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3 RC
https://www.microsoft.com/ja-jp/download/details.aspx?id=52685
すでにインストール済みならこの手順は必要ありません。
インストール済みかどうか分からない場合は、とりあえずこの手順をスキップして、エラーになったらインストールしてみてください。
3..NETのラッパーDLLをCOMとして登録します。
管理者権限でコマンドプロンプトを開き、解凍したファイルのフォルダに移動します。
コマンドプロンプトで以下のコマンドを入力します。
RegAsm.exe LayerNET.dll /codebase /tlb
RegAsm.exeは以下のフォルダのものを使います。
32bit版Excelの場合
C:\Windows\Microsoft.NET\Framework\バージョン番号
64bit版Excelの場合
C:\Windows\Microsoft.NET\Framework64\バージョン番号
バージョン番号はv4.0以上のものを使ってください。
4.Excelで空白のブックを作ります。
Excel 2016で空白のブックを新規作成し、解凍したフォルダ(MNIST.basがあるフォルダ)の中に、Excelマクロ有効ブック(*.xlsm)として保存します。
(Excel 2016以外でも動作すると思いますが未確認です。)
5..NETのラッパーDLLの参照設定をします。
Excelの開発のリボンでVisual BasicをクリックしてVBAの開発ウインドウを表示します。
開発ウインドウのメニューのツール - 参照設定をクリックします。
参照設定画面のリストをスクロールしてLayerNETをチェックして、OKをクリックします。
6.VBAのソースファイルをインポートします。
開発ウインドウのメニューのファイル - ファイルのインポートをクリックします。
7.イミディエイトウィンドウからサンプルプログラムを実行します。
イミディエイトウィンドウでTestMNISTと入力します。
下図のようにExcelのブックに停止ボタンとグラフが追加され、ミニバッチ内の進行状況が表示されます。
ミニバッチの値が6000になると最初のエポックの正解数が表示されます。
パラメータは乱数で初期化しているので、実行結果は毎回違います。
10エポックしても正解率が上がらない場合は、停止ボタンを押してからもう一度TestMNISTを実行してください。
VBAのソースの中のUseCUDAをTrueにするとCUDA版が動作します。
実行用のDLLファイルをソースファイルからビルドする方法
Visual Studio 2015を使います。
CUDA版(LayerCUDA.dll)のビルドにはCUDA Toolkit 8.0が必要です。
https://developer.nvidia.com/cuda-downloads
-
ソースファイルをダウンロードします。
http://lkzf.info/mkfn/download/mkfn-master.zip
以下では MKFNというフォルダにダウンロードしたとして説明します。 -
MKFN\mkfn.slnをビルドして実行すると、CPU版(Layer.dll)とCUDA版(LayerCUDA.dll)のレイヤーのソースファイルが生成されます。
-
MKFN\src\Layer\Layer\Layer.slnをビルドしてLayer.dllを作ります。
-
MKFN\src\Layer\LayerCUDA\LayerCUDA.slnをビルドしてLayerCUDA.dllを作ります。
-
管理者権限でVisual Studio 2015を起動して、MKFN\src\Layer\LayerNET\LayerNET.slnをビルドしてLayerNET.dllを作ります。
※ LayerNET.dllはビルド時に「COM 相互運用機能の登録」をするので管理者権限が必要です。 -
Layer.dllとLayerCUDA.dllとcudart64_80.dllを、LayerNET.dllがあるフォルダにコピーします。
※ cudart64_80.dllはCUDA Toolkit 8.0のDLLです。
※ 32bit版のCUDAはありません。
おわりに
とりあえず公開しましたが、まだ手つかずの作業が多いです。
- レイヤーの動作のドキュメント
- スピードアップ
- ドロップアウトや正則化など
開発の進捗はTwitterをご覧ください。
teatime77
ここまで読んでいただき、ありがとうございます。
何か誤りがありましたら指摘していただければ幸いです。