如何在从keras转换的coreml中格式化conv1d/lstm nn的输入数据

如何在从keras转换的coreml中格式化conv1d/lstm nn的输入数据,keras,ios11,xcode9-beta,xcode9,coreml,Keras,Ios11,Xcode9 Beta,Xcode9,Coreml,我的带有输入形状的keras模型(无,40[timesteps],12[features])如下所示: model=Sequential([ Conv1D(每个层的节点,过滤器长度,子样本长度=2,激活='relu',输入形状=(时间步,数据尺寸),名称='accelerations'), Conv1D(每个层的节点,过滤器长度,子样本长度=1,激活=relu'), LSTM(每个层的节点数,返回序列=True), LSTM(每层节点数,返回序列=False), 辍学, 密集(num_类), 激

我的带有输入形状的keras模型(无,40[timesteps],12[features])如下所示:

model=Sequential([
Conv1D(每个层的节点,过滤器长度,子样本长度=2,激活='relu',输入形状=(时间步,数据尺寸),名称='accelerations'),
Conv1D(每个层的节点,过滤器长度,子样本长度=1,激活=relu'),
LSTM(每个层的节点数,返回序列=True),
LSTM(每层节点数,返回序列=False),
辍学,
密集(num_类),
激活('softmax',name='scores'),
])
将其转换为.mlmodel后,我将其添加到我的XCodeProject中:

然后,我尝试进行推理并获得预测分数:

func makePredictionRequest(currentScaledMotionArrays:[[Double]]{
let data=_currentScaledMotionArrays.reduce([],+)//结果的类型为[Double],包含480个元素
做{
让mlMultiArray=try mlMultiArray(形状:[40,12],数据类型:MLMultiArrayDataType.double)
对于data.enumerated()中的(索引、元素){
mlMultiArray[索引]=NSNumber(值:元素)
}
让输入=PredictionModelInput(加速:mlMultiArray)
let predictionOutput=try\u predictionModel.prediction(输入:输入)
}
抓住{
打印(错误。本地化描述)
}
}
但是predictionModel.prediction(输入:输入)方法总是失败并抛出以下错误:

模型期望输入功能lstm_1_h_in为数组,但输入类型为0

所以需要初始化lstm层的隐藏状态。我不知道这种行为是否是意料之中的,因为我以前从未遇到过同样的问题。无论是在keras本身还是在google cloud ml中进行推理,我都不知道初始值,通常选择这些值进行推理。也许只是零的数组?有人面临过类似的问题吗


可以找到.mlmodel文件。

我实际上实现了我想要做的事情

以下代码段适用于swift 4.0keras 2.0.4coremltools 0.4.0

keras输入形状为(无,40[时间步],12[功能]。请注意下面更改的参数顺序(40[timesteps],无,12[features])

两个lstm层的所有32个节点的隐藏统计信息均初始化为零。我必须测试这是否会导致预期的行为,或者我是否必须随机初始化它们

func makePredictionRequest(evaluationStep:evaluationStep){
let data=_currentScaledMotionArrays.reduce([],+)//结果的类型为[Double],包含480个元素
做{
让accelerationsMultiArray=尝试MLMultiArray(形状:[40,1,12],数据类型:MLMultiArrayDataType.double)
对于data.enumerated()中的(索引、元素){
accelerationsMultiArray[索引]=NSNumber(值:元素)
}
让hiddenStatesMultiArray=尝试MLMultiArray(形状:[32],数据类型:MLMultiArrayDataType.double)

对于0中的索引。实际的错误消息是什么?愚蠢的我,我只是从apple文档中复制了代码,而没有实际捕获到错误。我相应地更改了我的问题。“零”初始化如何影响您的输出?分类工作如预期的那样(我的.gif上实际显示了正在使用的代码)类似于我在google cloud ml上的实现,我不需要初始化任何东西。我感觉,只要序列足够长,初始化其实并不重要。但到目前为止,我还没有测试过随机初始化。