Входные данные CoreML LSTM не соответствуют форме ввода Keras - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь преобразовать очень простую модель keras в CoreML, однако входные данные модели CoreML, похоже, не соответствуют моим ожиданиям.

Модель, которую я создаю, имеет форму ввода (5, 10) (пять временных шагов, 10 функций), однако, после преобразования модели и открытия модели в Xcode, она говорит, что тип ввода: MultiArray (Double 10), который, по моему пониманию, является одномерным массивом. У меня вопрос, что я делаю не так? Есть ли способ сообщить CoreML, что входные данные конкретно 5x10?

Вот модель keras, которую я создаю

from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense

length = 5
n_features = 10
out_index = 2

model = Sequential()
model.add(LSTM(25, input_shape=(length, n_features)))
model.add(Dense(n_features, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

Я запускаю следующий код для преобразования модели

import coremltools
coreml_model = coremltools.converters.keras.convert(model)
coreml_model.save("Echo.mlmodel")

В Xcode вы можете видеть входные данные, которые он интерпретировал из модели Xcode CoreML input output

Редактировать (01/12/20):

I пытался быть умным, и просто отредактировать модель coreml непосредственно в python,

coreml_model._spec.description.input[0].type.multiArrayType.shape[:] = [1, 5, 10]

К сожалению, это вызывает ошибки компиляции в Xcode Xcode compilation error

Также для справки, вот версии библиотеки, на которых работает мой блокнот:

keras 2.2.5
tensorflow 1.15.0
coremltools 3.1

1 Ответ

0 голосов
/ 15 января 2020

После некоторого исследования похоже, что метка типа ввода немного вводит в заблуждение. Хотя он говорит MultiArray (Double 10), на самом деле он принимает многомерный массив. Предостережение здесь - это форма массива.

В то время как с Keras я мог бы передать массив размером (1, 5, 10) (т. Е. (batch, timestemps, features) при запуске predict, с CoreML, вы должны транспонировать входные данные для совпадения (timestep, batch, features).

Следовательно, правильный способ интерпретации поля «type» в Xcode состоит в том, что вход принимает 10 функций. Поле «Description» (не видно на скриншоте) должно быть используется для описания ожидаемой формы массива.

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