レトリバ製品企画部の田村(@masatam81)です。
1/15にレトリバセミナーにて「Functional CNN in Elixir」というタイトルでお話しました。
セミナーの内容としては、趣味や20%ルールで書いていたElixirでのDeep LearningフレームワークでConvolution2D/MaxPooling2Dまで使えるようになったので、関数型言語ならではの苦労や工夫・学びの共有といった感じでした。本記事は、そのフォローアップ記事です。当日はDeep LearningやElixirに詳しくない人もいたため、それらの簡単な説明も含めて、なるべく伝わるように話しました。
本記事ではDNNやCNN、Elixirの簡単な説明やConvolution2D、MaxPooling2D以外のレイヤーの話は省きます。その辺りの話は下記のYouTubeや関連書籍を見て下さい。動画ではNIFやMatrexに関しても少しだけ話しています。
スライドはこちらになります。
www.slideshare.net
また、本記事ではConvolution2D, MaxPooling2DのElixirでの実装で工夫した点にフォーカスして書きたいと思います。
セミナーでは最初に defstruct
で構造体を作り、 defprotocol
を利用して各レイヤーをLayerモジュールの継承関係のように扱う例を説明してから、それを関数型らしく修正した話をしましたが、今回の引用コードは修正後のコードを示します。
実装のベースになっている知識はオライリー・ジャパンの「ゼロから作るDeep Learning」です。元の処理に関する詳細な説明は、そちらをご覧下さい。
- 畳み込みの準備
- im2colとは
- Elixirでの実装
- forward処理
- MaxPooling2D
- Elixirでの実装
- Convolution2D
- Elixirでの実装
- MaxPooling2D
- backward処理
- MaxPooling2D
- Elixirでの実装
- Convolution2D
- Elixirでの実装
- MaxPooling2D
- 速度の問題
- フレームワークの今後