Metal Performance Shadersについて
iOS10からiOSで畳み込みニューラルネットを作れるようになりました。畳み込み層、プーリング層、正規化層、活性化関数など基本的なツールは揃っています。ただし最適化アルゴリズムなどは揃っておらず、学習はできません。Pythonなどで学習したモデルをプロジェクト内に持ってきてその重みやバイアスを使用することになります。AppleのサンプルコードでもMNISTを学習したモデルをプロジェクト内に置いていますが、肝心のファイルの拡張子は.dataとなっており、どんな種類のファイルなのかわからなかったので調べてみました。
Pythonライブラリにおけるモデルの保存形式
Chainerのドキュメントを見てみるとsave_npz
とsave_hdf5
という二つのモデル保存用メソッドがあります。npzはNumPy配列を保存するファイル形式のようです。後者のHDF5はHierarchical Data Format 5という科学技術計算などで用いられるファイル形式のようです。
参考:http://yukisakamoto.hatenablog.com/entry/20130413/1365825028
SwiftでのHDF5の扱い方
SwiftでHDF5を読み取るにはHDF5Kitというオープンソースがあり、これを使えばChainerやKelasで学習したモデルを簡単にSwiftから読むことができました。
ただしHDF5Kitはdataset名などを指定する必要があるため、事前にHDF5ファイルの中身を知っておく必要があります。そこで使ったのがHDF5Viewというソフトです。これを使うと以下のようにHDF5ファイルの中身を読むことができます。
おわりに
一通り触った限りMPSではまだInference(推論)しかできないようですが、(fast-neural-styleなどをやってみたかったが難しかった。)ChainerやKerasのモデルを簡単に活用できるとなればiOSデバイス単体で実行するディープラーニングの可能性も大きく広がりますね。今後が楽しみです。
参照
今回の実装にあたり、情報と呼べる情報が非常に限られている中、@shu223様の以下の記事を大変参考にさせて頂きました。ありがとうございます。
iOSのMPSCNNによる手書き数字認識のサンプルを読む - 前編
iOSのMetalで畳み込みニューラルネットワーク - MPSCNNを用いた手書き数字認識の実装