"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

MMdnnで、tf.kerasのVGG16をONNX変換し、Neural Network Consoleへインポート。課題あり。

ONNXのような共通フォーマットのメリットを、現実的に享受することを考えると、「どこかの処理系で「学習済」のモデルをONNX形式を介して、自分の処理系にとりこんでファインチューニング」ができるかどうか?が大きいです。

現時点でどこまで可能になっているのか?

それを試してみたのが、今回のテーマです。

f:id:arakan_no_boku:20190216093642j:plain

 

結論から書いておきます

 

技術は日進月歩です。

以下は、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」を使います。

github.com

他にもありますが、今のところ、これが一番使い勝手が良い気がしてます。

使うには、インストールが必要です。

安定バージョンのインストール。

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の安定版の問題で、最新バージョンなら解決されているとのこと。

github.com

ということで、最新バージョンをインストールしました。

 

最新バージョンでリトライ

 

最新バージョンで同じように実行してみました。

mmconvert -sf keras -iw keras_vgg16.h5 -df onnx -om keras_vgg16.onnx

すると。

今度は違うエラーがでました( ノД`)シクシク…。

Unknown initializer: GlorotUniform

再び、StackOverflowです。

stackoverflow.com

なるほど。

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形式ファイルがインポートできます。

f:id:arakan_no_boku:20190216113628j:plain

新しいプロジェクトを作って、これを使って先ほど作成したONNXファイルをインポートします。

すると・・。

f:id:arakan_no_boku:20190216113857j:plain

エラーでした。

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バージョンをダウンさせて変換・出力するとかして、読み込めるフォーマットに落とす方法を探すとか・・。

まあ。

時間薬で、そのうちできるようになるから、待っている。

それが正解なんですかね。

ではでは。