To get deeper understanding of Keras models, translated a model to C language mostly by hand.
ディープニューラルネットワークのフレームワーク Keras で作成したモデルを、一般的な C 言語に変換する実験をしてみました。
現在は、さまざまな変換ツールがありますが、ツールそれぞれに一長一短があり、デファクトスタンダートと呼べるものはないのが現状です。また、先日 deeplearning.ai の機械学習コースを受講した際に、いくらフレームワークが便利であっても、やはり実際に自分の手で一からプログラムを書いてみることの重要性を知りました。自分の理解を確かめるという意味からも、今回は手作業で変換してみた次第です。
他のメリットとして、仮にモデルの自動変換ツールで対応できないターゲットマイコンでニューラルネットを実現しなくてはならなかったり、また自動変換の結果が意図しない結果となるような問題に遭遇したりしても、一度でも自分で手変換した経験があれば、それらの問題への対応力が上がるだろう、ということもあります。(例えば、私が長く使ってきた Texas Instruments 社の C6748 DSP や C6678 SoC では、C++ 言語を動かすことも不可能ではありませんが、このような組込プロセッサで C++ を使うことに抵抗があるお客様も多いのです。)
さて。今回使ったのは、以下のような簡単な Keras モデルです。先日投稿した(ネット上でいろいろ紹介されているものと同じですが)こちらのモデルを、記述的に少しだけ修正して使いました。
model = keras.models.Sequential([ Flatten(input_shape=(28, 28)), Dense(128), Activation('relu'), Dense(10), Activation('softmax') ])
以下が、C 言語に変換して動作させた結果です。
詳細は、以下の GitHub に上げさせて頂きました。
非常に小さな例ではありますが、皆様の御参考になれば幸いです。