Posted at

coreMLのInput数について

More than 1 year has passed since last update.


Inputの数には制約は無いが…

以前こちらの記事でTimeDistributedを擬似的に再現する手法を紹介しました。しかし、これにはその時には気づいていなかった罠がありました。

可能な方は手元でInputが512個くらいのモデルをKerasで適当に作ってcoremltoolsでconvertしてXcodeに乗っけてアプリをビルドしてみてください。

そうすると如何にパラメータ数が少なかろうが、

let mlmodel = MLModel()

と初回のイニシャライズをするだけで30秒くらい待たされます。(iPhone7で確認。もしかしたら最新の機種ではもう少し早いのかもしれません。シミュレータだと何故かもっと早かった。)

しかもその間CPU利用率100%に貼り付き、端末も熱を持ちます。やりすぎるとiPhoneの寿命に関わりそうなので試す方はやりすぎないように :sweat:

逆にモデルの構造を上手く作ることでInputを数個に減らしてあげられれば、パラメータ数が10万とか100万とかあろうとも1秒未満でイニシャライズできました。

なので現実的にアプリで利用しようと思うとInputを増やして何かを解決するのは得策じゃなさそうですね。。


Tips

モデルのInput数を減らす際、もちろん coremltools.converters.keras.convert に渡す引数のうちの input_names のリストの長さも変わるわけですが、それを忘れるとxcodeでコンパイルされる際に

coremlc: Error: Error reading protobuf spec. validator error: Layer 'xxxxx' consumes a layer named 'xxxxx' which is not present in this network.

というエラーが出ます。'xxxxx'の部分はちゃんと存在するレイヤーの名前が入っているので「not present」と言われる意味がわからないのですが、convert時にinput_namesを適切にしてやることでこのエラーは出なくなりました。

多分コードの深くを追えばこのエラーの理由も分かると思うのですが、パッと見自分がたどり着いた答えを指し示していないエラー文なので混乱しそうだなと。