В моей модели 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 преобразовать его для меня?