Преобразование Keras LSTM в Core ML приводит к получению входного слоя различной формы - PullRequest
7 голосов
/ 19 февраля 2020

Я преобразовал модель 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

Почему входной слой (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.

...