📚

iOSアプリエンジニアがCoreMLモデルを作るときにハマったこと

2023/12/18に公開

こんにちは、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_inputdense_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