ONNXのような共通フォーマットのメリットを、現実的に享受することを考えると、「どこかの処理系で「学習済」のモデルをONNX形式を介して、自分の処理系にとりこんでファインチューニング」ができるかどうか?が大きいです。
現時点でどこまで可能になっているのか?
それを試してみたのが、今回のテーマです。
結論から書いておきます
技術は日進月歩です。
以下は、2019年2月終了時点の記事ということを念頭に読んでくださいね。
さて。
今回やってみたのは以下の2つです。
- tf.kerasの学習済VGG16モデルをONNX形式ファイルに変換する
- 新規に作成したシンプルなkerasモデルをONNX形式ファイルに変換する
- 上記のONNXファイルをNeural Network Consoleにインポートする
試した(2019/02/16)バージョンは。
Tensorflow 1.12 / Neural Network Console 1.3.0 と 1.4.0
です。
結果は。
- tf.kerasの学習済VGG16モデルをONNX形式ファイルに変換する→NG
- 新規に作成したシンプルなkerasモデルをONNX形式ファイルに変換する→OK
- 上記のONNXファイルをNeural Network Consoleにインポートする→NG
でした。
以下、試行の詳細を書いていきます。
変換ツールの導入
変換ツールは、マイクロソフトの「MMdnn」を使います。
他にもありますが、今のところ、これが一番使い勝手が良い気がしてます。
使うには、インストールが必要です。
安定バージョンのインストール。
pip install mmdnn
最新バージョンのインストール。
pip install -U git+https://github.com/Microsoft/MMdnn.git@master
です。
使い方は後で。
あと、今回はTensorflow/kerasのモデルをONNXに変換するので、以下のモジュールもインポートしておく必要があります。
pip install onnx-tf
ひょっとしたら、今は不要なのかもしれませんが、自分の環境には既にはいっているので、いらなくなったかどうか・・まで、試してません。
tf.kerasの学習済VGG16モデルをONNX形式ファイルに変換する
以下のソースで保存します。
from keras.applications.vgg16 import VGG16 model = VGG16(weights='imagenet', include_top=False) model.save('keras_vgg16.h5')
簡単至極です。
ONNX形式に変換する
MMdnnを使って変換します。
まず、安定バージョンをインストールしました。
h5ファイルを保存したフォルダをカレントにして、以下のように実行します。
mmconvert -sf keras -iw keras_vgg16.h5 -df onnx -om keras_vgg16.onnx
すると。
以下のエラーになりました(;´д`)。
module 'keras_applications.mobilenet' has no attribute 'relu6'
Stack Overflowで調べてみると、どうやらMMdnnの安定版の問題で、最新バージョンなら解決されているとのこと。
ということで、最新バージョンをインストールしました。
最新バージョンでリトライ
最新バージョンで同じように実行してみました。
mmconvert -sf keras -iw keras_vgg16.h5 -df onnx -om keras_vgg16.onnx
すると。
今度は違うエラーがでました( ノД`)シクシク…。
Unknown initializer: GlorotUniform
再び、StackOverflowです。
なるほど。
tensorflowに組み込まれた「tf.keras」ではエラーがでるけど、独立した「keras」をインポートすればいけるよ・・と言うことです。
でも。
インポートしているのは「from keras.applications.vgg16 import VGG16」なので、tf.kerasではない。
にも拘わらずエラーになるということは、内部的にはどっかでつながってるということなんでしょうね。
この時点で、kerasの学習済VGG16モデルの変換はOUTです。
新規に作成したシンプルなkerasモデルをONNX形式ファイルに変換する
今度は、何の変哲もないシンプルなモデルを変換してみます。
まず、モデルの保存から。
# encoding: utf-8 from keras.models import Sequential from keras.layers.core import Dense, Activation # ネットワークの定義 model = Sequential([ Dense(512, input_shape=(784,)), Activation('sigmoid'), Dense(10), Activation('softmax') ]) model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy']) model.save('test.h5')
あとで、試せるようにMNISTのインプットを想定してます。
これを、同じように変換します。
mconvert -sf keras -iw test.h5 -df onnx -om test.onnx
こんどはうまくいきました。
ほぼ、元のh5ファイルと同サイズのonnxファイルができました。
上記のONNXファイルをNeural Network Consoleにインポートする
Neural Network Console1.3、1.4では、ONNX形式ファイルがインポートできます。
新しいプロジェクトを作って、これを使って先ほど作成したONNXファイルをインポートします。
すると・・。
エラーでした。
ValueError: ONNX IR version newer than 3 is currently not supported: 4
訳すと。
3より新しいONNX IRバージョンは現在サポートされていません:4
ということです。
これは、Neural Network Consoleの1.3でも、1.4でも同じでした。
まとめると
Tensorflow/kerasの1.12でSaveしたモデルをMMdnnでONNXに変換する場合、現在の安定版ではなく、最新バージョンを使う必要がある。
MMdnnの最新バージョンは「ONNX IR version = 4」をサポートしている。
対して。
Neural Network ConsoleのONNX形式インポートは、まだ「ONNX IR version = 3」までしかサポートしていない。
なので、現時点では「今回試したアプローチではうまくいかない」です。
Neural Network Consoleのバージョンがあがるか、MMdnnでIRバージョンをダウンさせて変換・出力するとかして、読み込めるフォーマットに落とす方法を探すとか・・。
まあ。
時間薬で、そのうちできるようになるから、待っている。
それが正解なんですかね。
ではでは。