📚
iOSアプリエンジニアがCoreMLモデルを作るときにハマったこと
こんにちは、noppeです。
CoreMLモデルを作ってみているのですが、上手くいってないのでとりあえず5号目あたりまで登る時に困ったことを紹介します。
Kerasのサブクラスでモデルを作らない
CoreMLのモデルに変換するcoremltoolsを使うには、Kerasの構造がSequentialモデルか、functionalモデルである必要があります。
そのため、Kerasのサブクラスでモデルを作るとせっかく学習させてもCoreMLのモデルに変換することができません。
mlpackageを作りたいときは、ファイル名を指定する
あまり馴染みがないのですが、ファイル名にmlpackage
をつけると自動的にmlpackageとして保存してくれます。
ml_model = ct.convert(model)
ml_model.save("MLModel.mlpackage")
InputがImageの時は明示的にImageTypeを指定する
ImageTypeを指定しないと、SwiftからMLMultiArrayという配列を直に扱うことになります。
ct.convert(
model,
inputs=[
ct.ImageType()
],
)
レイヤーに名前を付けておく
レイヤーに名前を付けておくことで、Swiftから呼ぶ際のプロパティ名を決めることができます。
特にレイヤー名は実行するたびにdense_1_input
、dense_2_input
…と名前が変わってしまうので決めておいた方が良いです。
layer1 = tf.keras.Input(name="input", shape=(82,))
layer2 = tf.keras.layers.Embedding(input_dim=100, output_dim=10, input_length=82)(layer1)
layer3 = tf.keras.layers.LSTM(name="output", units=200, return_sequences=False)(layer2)
なお、Inputを使わない場合は最初のレイヤーの名前+_inputという名前になります。
基本的にはInputを頭につけておくのがおすすめです
思いついたら追記します
Discussion