Kerasでの学習結果をmlmodelにしてiOSで使う
タイトル通りKerasで学習させ、その結果をmlmodelファイルで得て、それをiOSで使いたい。その変換に恐ろしく苦労した。
Python version 3.7.4
TensorFlow version 2.0.0
tf.keras version 2.2.4-tf
macOS Catalina 10.15.1
↑という環境。
自作のデータセットでMNISTをやってみた。
学習結果を
model.save(H5FilePath)
てな感じで.h5ファイルとして保存。まあここまではOK。
次にこの.h5ファイルを変換する。
GitHub - apple/coremltools: Core ML Community Tools.
Python3+Keras2のモデルをCore ML形式に変換する(2018年5月) - Qiita
Core MLモデルの入力の型をMLMultiArrayから画像(CVPixelBuffer)に変更する - Qiita
↑この辺りを参考にcoremltoolsを使いやってみたものの、、、できない。
AttributeError: module 'coremltools.converters.keras' has no attribute 'convert'
とか。
公式通りvirtualenv使ったり、Kerasをインストール(tf.kerasじゃダメ!って見たので)したり、Pythonのバージョンを3.5にしてみたり。
まあいろいろやってみたんだけど俺にはできなかった。
TensorFlowのバージョンを1.xに下げるといいともあったが、これは最後の手段ということで模索し続けた。
結局のところ、使ったのはtfcoremlだ、、、何?この敗北感。
と喜んだのも束の間、iOSで使おうとすると
さらに調べると
coremltools 3.1の環境構築(2019年11月版) - Qiita
↑mlmodelを修正というかupdateするなんてできるそうだ。
試してみたところ、確かにmlmodelの入力の形式が

↑MultiArray (Double 1 x 28 x 28 x 1) だったのが、、、

↑Image (Grayscale 28 x 28)に変わった。
これをiOSで使うとなんとか予測の計算はできた。
ただ、mlmodelの出力形式がMultiArray (Double)なので(Kerasの出力がsoftmax関数なので)、自分でどのラベルに該当するか処理を記述必要がある。VNClassificationObservationは使えず、VNCoreMLFeatureValueObservationからMLMultiArrayの中身を調べて最大なのを探すとか。
出力形式もupdateしたかったがやり方がわからなかった。
※1のところで
image_input_names = ['x_input’],
class_labels = classLabels,
などが指定できたらいいのだけど、できなかった。
Python version 3.7.4
TensorFlow version 2.0.0
tf.keras version 2.2.4-tf
macOS Catalina 10.15.1
↑という環境。
自作のデータセットでMNISTをやってみた。
学習結果を
model.save(H5FilePath)
てな感じで.h5ファイルとして保存。まあここまではOK。
次にこの.h5ファイルを変換する。
GitHub - apple/coremltools: Core ML Community Tools.
Python3+Keras2のモデルをCore ML形式に変換する(2018年5月) - Qiita
Core MLモデルの入力の型をMLMultiArrayから画像(CVPixelBuffer)に変更する - Qiita
↑この辺りを参考にcoremltoolsを使いやってみたものの、、、できない。
AttributeError: module 'coremltools.converters.keras' has no attribute 'convert'
とか。
公式通りvirtualenv使ったり、Kerasをインストール(tf.kerasじゃダメ!って見たので)したり、Pythonのバージョンを3.5にしてみたり。
まあいろいろやってみたんだけど俺にはできなかった。
TensorFlowのバージョンを1.xに下げるといいともあったが、これは最後の手段ということで模索し続けた。
結局のところ、使ったのはtfcoremlだ、、、何?この敗北感。
import tfcoreml # 1.1↑これでやっと.mlmodelが出力された!
model = tfcoreml.convert(H5FilePath,
input_name_shape_dict={'x_input': (1, 28, 28, 1)},
output_feature_names=['Identity'],
image_scale = 1.0/255.0,
minimum_ios_deployment_target='13'
#(※1)
)
model.save(MlmodelFilePath)
と喜んだのも束の間、iOSで使おうとすると
let vnmodel = try VNCoreMLModel(for: weights().model)↑ここで落ちる。modelを作成自体できなかった。
さらに調べると
coremltools 3.1の環境構築(2019年11月版) - Qiita
↑mlmodelを修正というかupdateするなんてできるそうだ。
試してみたところ、確かにmlmodelの入力の形式が

↑MultiArray (Double 1 x 28 x 28 x 1) だったのが、、、

↑Image (Grayscale 28 x 28)に変わった。
これをiOSで使うとなんとか予測の計算はできた。
ただ、mlmodelの出力形式がMultiArray (Double)なので(Kerasの出力がsoftmax関数なので)、自分でどのラベルに該当するか処理を記述必要がある。VNClassificationObservationは使えず、VNCoreMLFeatureValueObservationからMLMultiArrayの中身を調べて最大なのを探すとか。
出力形式もupdateしたかったがやり方がわからなかった。
※1のところで
image_input_names = ['x_input’],
class_labels = classLabels,
などが指定できたらいいのだけど、できなかった。
スポンサーサイト
<< coremltoolsでKerasでの学習結果をmlmodelにconvertしたい TopPage macOS CatalinaにPython/TensorFlowをインストール >>
トラックバック
トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1324-ff0beb82
https://ringsbell.blog.fc2.com/tb.php/1324-ff0beb82