Inputの数には制約は無いが…
以前こちらの記事でTimeDistributedを擬似的に再現する手法を紹介しました。しかし、これにはその時には気づいていなかった罠がありました。
可能な方は手元でInputが512個くらいのモデルをKerasで適当に作ってcoremltoolsでconvertしてXcodeに乗っけてアプリをビルドしてみてください。
そうすると如何にパラメータ数が少なかろうが、
let mlmodel = MLModel()
と初回のイニシャライズをするだけで30秒くらい待たされます。(iPhone7で確認。もしかしたら最新の機種ではもう少し早いのかもしれません。シミュレータだと何故かもっと早かった。)
しかもその間CPU利用率100%に貼り付き、端末も熱を持ちます。やりすぎるとiPhoneの寿命に関わりそうなので試す方はやりすぎないように
逆にモデルの構造を上手く作ることで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を適切にしてやることでこのエラーは出なくなりました。
多分コードの深くを追えばこのエラーの理由も分かると思うのですが、パッと見自分がたどり着いた答えを指し示していないエラー文なので混乱しそうだなと。