Переход модели Keras с поддержкой Tensorflow на CoreML

У меня есть простая модель Keras с поддержкой Tensorflow, которая выглядит следующим образом:

x_test = np.zeros((len(data) - max_samples, max_len, max_features), dtype=np.bool)
y_test = np.zeros((len(data) - max_samples, max_len, max_features), dtype=np.bool)

#... Populate x_test and y_test

model = Sequential()
model.add(LSTM(32, batch_input_shape = (1, max_len, max_features), return_sequences=True, stateful=True))
model.add(Dense(max_features, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=RMSprop(lr=0.01),  metrics=['accuracy'])

который отлично работает в Python, когда он предсказывает, используя ввод формы (1, max_len, max_features)

Однако при экспорте в модель CoreML с использованием coremltoolsвход полностью отличается, как показано здесь:

Требуется 3 массива двойников. Не уверен, почему и каково отображение моей первоначальной формы.

Обновить:

Я пытался кормить в модели весов для lstm_1_h_in а также lstm_1_c_in каждая итерация выглядит следующим образом, но, увы, модель возвращает nan в этом случае.

Model* model = [Model new];
MLMultiArray* h = [[MLMultiArray alloc] initWithShape:@[@(neurons)]
                                             dataType:MLMultiArrayDataTypeDouble
                                                error:&error];
MLMultiArray* c = [[MLMultiArray alloc] initWithShape:@[@(neurons)]
                                         dataType:MLMultiArrayDataTypeDouble
                                            error:&error];
NSAssert(error == nil, assertMessage);

for (NSUInteger i = 0; i < neurons; i++) {
    [h setObject:@(0) forKeyedSubscript:@[@(i)]];
    [c setObject:@(0) forKeyedSubscript:@[@(i)]];
}

ModelOutput* modelOutput = nil;
for (NSUInteger i = 0; i < data.count; i++) {

    MLMultiArray* input = [[MLMultiArray alloc] initWithShape:@[@(modelZCount)]
                                                         dataType:MLMultiArrayDataTypeDouble
                                                            error:&error];
    NSAssert(error == nil, assertMessage);

    NSArray* key = @[data[i]];
    [input setObject:@(1) forKeyedSubscript:key];

    ModelInput* modelInput = [[ModelInput alloc] initWithInput1:input
                                                    lstm_1_h_in:h
                                                    lstm_1_c_in:c];

    modelOutput = [model predictionFromFeatures:modelInput error:&error];
    assertMessage = @"Failed to predict based on settings";
    NSAssert(error == nil, assertMessage);
    NSAssert(modelOutput != nil, assertMessage);

    h = modelOutput.lstm_1_h_out;
    c = modelOutput.lstm_1_c_out;
}

//modelOutput.output1 is @[nan, nan, nan, ...]
//same for lstm_1_h_in and lstm_1_c_in

0 ответов

Другие вопросы по тегам