Ios Tensorflow-backed Keras模型到CoreML的转换

Ios Tensorflow-backed Keras模型到CoreML的转换,ios,machine-learning,tensorflow,keras,coreml,Ios,Machine Learning,Tensorflow,Keras,Coreml,我有一个简单的Tensorflow-backed Keras模型,如下所示: 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 = Seq

我有一个简单的Tensorflow-backed Keras模型,如下所示:

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中,当它使用shape
(1,max\u len,max\u features)的输入进行预测时,它可以很好地工作。

但是,当使用
coremltools
导出到CoreML模型时,输入完全不同,如下所示:

它需要3个双精度阵列。不知道为什么,我的初始形状的映射是什么

更新:

我尝试按如下方式输入每个迭代中的
lstm\u 1\u h\u和
lstm\u 1\u c\u的模型权重,但在这种情况下,模型返回
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
Model*Model=[Model new];
MLMultiArray*h=[[MLMultiArray alloc]initWithShape:@[@(神经元)]
数据类型:MLMultiArrayDataTypeDouble
错误:&错误];
MLMultiArray*c=[[MLMultiArray alloc]initWithShape:@[@(神经元)]
数据类型:MLMultiArrayDataTypeDouble
错误:&错误];
NSAssert(错误==nil,assertMessage);
对于(整数i=0;i<0;i++){
[h setObject:@(0)forKeyedSubscript:@[@(i)];
[c setObject:@(0)forkeydsubscript:@[@(i)];
}
ModelOutput*ModelOutput=nil;
对于(整数i=0;i
batch size dim已删除?我以前没有将CoreML与RNN一起使用过,但LSTM单元格会将先前(或初始)隐藏状态作为输入。这是您在这里看到的两个额外输入。在Keras中,您还可以使用
初始状态
参数提供这些参数。如果删除
stateful=True
,会发生什么情况?你的核心ML模型还有那两个额外的输入吗?@Matthijs Hollemans我在想这个问题,但在Keras中,当使用predict时,你不必这样做,这让我偏离了轨道。如果我删除stateful,事情就完全一样了。事实上,现在我在考虑它,有意义,而不是发送你发送前一个状态的时间。我将尝试并报告。@MatthijsHollemans我尝试过,不幸的是,输出总是
nan
。更新了我的答案。我的问题是,我没有将多数组初始化为0。显然,它们是用垃圾值初始化的。