頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


TensorFlow2.0の学習結果を.h5→.pb→.mlmodelと変換してiOSで使う

やりたいことは、TensorFlow 2.0 + Kerasで学習させた結果をiOSで使いたい。
iOSで係数だけをもらうことも可能(※1)だが、mlmodel形式だと一番使いやすいのでベスト。

度重なる試行錯誤の結果、自分の場合はこれでいけた、というのをシェア。


TensorFlow 2.0で学習し、その結果を.h5ファイルで保存する。

virtualenvでTensorFlow 1.14.0の環境を作成、そこで
(1).h5ファイルを.pbファイルに変換
(2)その.pbファイルを.mlmodelに変換
これでiOSでVision/CoreMLを使いすんなりと予測ができた。


(1).h5→.pbの変換
Deep Learningアプリケーション開発 (2) TensorFlow with Python - Qiita
.h5→.pbの変換は↑こちらのページにある通り。ただ感謝、感謝!

(2).pb→.mlmodelの変換
上記リンク内の通りに動かすと.pbファイルができる。同じフォルダに.jsonファイルも生成されて、そこを見て入出力の名前を確認しておく必要がある。確かにKerasで自分で付けた名前と違っていた。
後はtfcoremlを使って以下のようにして変換。
import tfcoreml as tf_converter

classLabels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15']

tf_converter.convert(tf_model_path = PbFilePath,
mlmodel_path = MlmodelFilePath,
output_feature_names = ['y_out/Softmax:0'],
input_name_shape_dict = {'x_input:0':[1, height, width, 3]},
image_input_names = ['x_input:0'],
class_labels = classLabels,
image_scale = 1.0/255.0
)
なお、この2回の変換はTensorFlow 2.0だとすんなり動かず、、、私には書き換えられそうにないので諦めました。この変換だけ1.14.0で実行することにします。





以下は背景とか。

当初は、
Kerasでの学習結果をmlmodelにしてiOSで使う

ここに書いた方法の.h5ファイルを.mlmodelに変換、updateする、でなんとかなると思っていた。
MNIST(白黒、畳み込みなし)で検証していけることを確認したのだが、、、

いざ本番(※2)の学習結果を同様にやろうとしたらupdateがうまくいかない。一応保存まではするんだが、
RuntimeWarning: You will not be able to run predict() on this Core ML model. Underlying exception message was: Error compiling model: "compiler error: Espresso exception: "Invalid argument": generic_reshape_kernel: Invalid bottom shape (32 8 2 1 1) for reshape to (20480 -1 1 1 1)".
RuntimeWarning)

なんて警告が出る。
途中での計算がうまくいってないんだろうか?MNISTは畳み込みを使っていないモデル、白黒画像を入力だったが、今回は畳み込みあり、カラー画像入力というように多少異なる。そのあたりに起因するcoremltoolsのバグなのかなんなのか、、、?
試しにXcodeで使おうとしても、

Xcodeでのエラーメッセージ

↑同じエラーが表示されビルドできなかった。






※1
係数だけ出力してiOSでそれを読み込む、というのもやったことあるが、iOS内でニューラルネットを構成して係数を読み込んで、、、とか記述が膨大。一度mlmodelを味わうともうやってられない。

※2
個体値カメラ
↑先日リリースしたこのポケモンGO用の個体値チェックアプリではバーの部分の画像(カラー)を入力画像として予測している。リリース版ではTensorFlow 1.14を使っていたが、macOSの破損→クリーンインストールを機に、TensorFlow 2.0 + Kerasで学習させ、その結果をiOSで使えるようにしたいのだ。
スポンサーサイト




<< macOSのDocument Based Applicationの公式サンプルコードの謎  TopPage  iOSアプリ「個体値カメラ」のリジェクト対応 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1328-e46a0aa9




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.