Я преобразовал модель Keras в модель Core ML, используя coremltools
. Исходная модель Keras имеет следующую архитектуру:
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
word_embeddings (InputLayer) (None, 30) 0
__________________________________________________________________________________________________
embedding (Embedding) (None, 30, 256) 12800000 input_1[0][0]
__________________________________________________________________________________________________
activation_1 (Activation) (None, 30, 256) 0 embedding[0][0]
__________________________________________________________________________________________________
bi_lstm_0 (Bidirectional) (None, 30, 1024) 3149824 activation_1[0][0]
__________________________________________________________________________________________________
bi_lstm_1 (Bidirectional) (None, 30, 1024) 6295552 bi_lstm_0[0][0]
__________________________________________________________________________________________________
concatenate_1 (Concatenate) (None, 30, 2304) 0 bi_lstm_1[0][0]
bi_lstm_0[0][0]
activation_1[0][0]
__________________________________________________________________________________________________
attlayer (AttentionWeightedAver (None, 2304) 2304 concatenate_1[0][0]
__________________________________________________________________________________________________
softmax (Dense) (None, 64) 147520 attlayer[0][0]
==================================================================================================
Я могу выполнить выводы для модели в Keras / Python со следующим вводом:
model.predict(tokenized)
# where tokenized = [[ 13 93 276 356 11 2469 18 144 453 269 11 0 0 0
# 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 0 0]]
# of class 'numpy.ndarray' and shape (1, 30)
Однако после преобразования Моя модель Core ML показывает следующую форму для входного слоя.
input {
name: "word_embeddings"
type {
multiArrayType {
shape: 1
dataType: FLOAT32
}
}
}
![enter image description here](https://i.stack.imgur.com/OP8cl.png)
Почему входной слой (word_embeddings
) потерял свою форму после преобразования Core ML? Я ожидаю, что его тип покажет MultiArray (Float32 1 x 30)
. В идеале я хотел бы иметь возможность передать полный 30-элементный вектор, как я делал ранее.
Я прочитал Apple Core ML LSTM do c, что предполагает, что мне может понадобиться многократно вызывать model.prediction(..)
по одному элементу за раз, захватывая выходные состояния каждого прогноза и передавая их в качестве входных данных следующему, пока я не достигну конца полной последовательности (все 30 элементов ). В качестве альтернативы, можно ли использовать Core ML Batch API , чтобы сделать это проще?
Это необходимо?
Для контекста модель принимает «предложение» то есть список из 30 слов (разбитых на уникальные целые числа) и выводит классификацию «emoji», одно из 64 возможных значений.
Преобразование выполняется в Colab с coremltools == 3.3 с keras = = 2.3.1 и Python 2.7.17.