coremltools преобразует слой GRU, вызванный с initial_state - PullRequest
0 голосов
/ 21 марта 2019

В моей модели Keras я передаю параметр initial_state при вызове уровня GRU.Мое приложение отслеживает состояние encoder_state и передает его обратно в модель, когда я хочу прогнозировать новый вход.

encoder_output, encoder_state = GRU(latent_dim,return_state=True,name='gru')(encoder_input,initial_state=state)

Все хорошо, когда выполняется вывод с Keras, но проблема возникает, когда я пытаюсь преобразоватьк модели coreML.

0 : input_56, <keras.engine.topology.InputLayer object at 0x7f5e21159668>
1 : input_57, <keras.engine.topology.InputLayer object at 0x7f5e21159630>
2 : gru, <keras.layers.recurrent.GRU object at 0x7f5e2116a9e8>
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/lbai/.local/lib/python3.6/site-packages/coremltools/converters/keras/_keras_converter.py", line 752, in convert
    custom_conversion_functions=custom_conversion_functions)
  File "/home/lbai/.local/lib/python3.6/site-packages/coremltools/converters/keras/_keras_converter.py", line 550, in convertToSpec
    custom_objects=custom_objects)
  File "/home/lbai/.local/lib/python3.6/site-packages/coremltools/converters/keras/_keras2_converter.py", line 316, in _convert
    converter_func(builder, layer, input_names, output_names, keras_layer)
  File "/home/lbai/.local/lib/python3.6/site-packages/coremltools/converters/keras/_layers2.py", line 1058, in convert_gru
    reverse_input = reverse_input)
  File "/home/lbai/.local/lib/python3.6/site-packages/coremltools/models/neural_network/builder.py", line 1530, in add_gru
    spec_layer_params.inputVectorSize = input_size
TypeError: (None, 256) has type tuple, but expected one of: int, long

Когда я проверяю форму этого слоя Keras, я получаю то, что ожидаю.Первый кортеж - это форма encoder_input, а второй - форма initial_state.

print(encoder.get_layer('gru').input_shape)
>>> [(None, 1, 1536), (None, 256)]

Изучение кода coreML для convert_gru подсказывает мне, что в качестве input_size он принимает последнюю запись в input_shape, что в моем случаеis (Нет, 256).

def convert_gru(builder, layer, input_names, output_names, keras_layer):

  ...

  input_size = keras_layer.input_shape[-1]

Кто-нибудь знает, как я могу передать initial_state своему слою GRU и заставить coreml преобразовать его для меня?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...