LoginSignup
1
3

More than 5 years have passed since last update.

coreMLのInput数について

Posted at

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を適切にしてやることでこのエラーは出なくなりました。
多分コードの深くを追えばこのエラーの理由も分かると思うのですが、パッと見自分がたどり着いた答えを指し示していないエラー文なので混乱しそうだなと。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3