创建一个CoreML LRCN模型。

3

您好,非常感谢您提供的任何帮助和指导!

我提出的问题源于发布在苹果CoreML文档站点上的一篇文章。这篇文章的主题也在WWDC 2017讲座中涉及,并且我觉得它非常有趣。我最近发布了一个与我正在处理的同一项目的一部分相关的问题,并且很容易解决;然而,随着我深入这个努力,我发现自己不明白如何实现这个模型的一部分。

首先,我正在Keras中构建一个模型,使用Tensorflow后端在时间分布包装器中使用卷积层。在卷积部分之后,单个LSTM层连接到密集层作为输出。目标是创建一个多对多结构,对填充序列中的每个项目进行分类。我将在下面发布模型的代码。

我的培训和部署计划可能会引起其他问题,但如果它们造成麻烦,我会单独发布帖子。它涉及使用时间分布包装器进行培训,然后在CoreML转换时剥离模型并加载包装层的权重,因为时间分布包装器与CoreML不兼容。

我的问题是:

在上述文章(以及我在GitHub上找到的一个CormeML示例项目)中,实现非常聪明。由于CoreML(或至少是股票转换器)不支持图像序列作为输入,因此图像逐个传送,并将LSTM状态作为输出与输入图像的预测一起传递。对于序列中的下一个图像,用户传递图像以及前一个时间步的LSTM状态,以便模型可以“从上次离开的地方”处理单个输入并将其作为序列处理。它形成了LSTM状态的循环(这在苹果文章中有更详细的说明)。现在,关于实际问题部分...

在像Keras这样的库中如何实现此功能?到目前为止,我已经成功地使用函数API和LSTM层上的“return_state”设置输出LSTM状态,并将其路由到辅助输出。相当简单。对于我来说不太简单的是,如何将该状态传回网络以进行下一次预测。我已经查看了LSTM层的源代码和文档,没有看到任何跳出状态的输入。我唯一能想到的是,可能使LSTM层成为自己的模型,并使用“initial_state”进行设置,但是根据我在Keras GitHub上找到的帖子,似乎模型然后需要自定义调用函数,我不知道如何将其融入CoreML。只是为了信息,我计划将隐藏状态和单元状态循环进出模型,除非不必要,并且仅使用隐藏状态,如Apple的模型所示。

再次感谢。始终感激提供的任何帮助!

我的当前模型如下:

image_input = Input(shape=(max_sequence_length, 224, 224, 3))
hidden_state_input = Input(shape=((None, 256)))
cell_state_input = Input(shape=((None, 256)))

convolutional_1 = TimeDistributed(Conv2D(64, (3, 3), activation='relu', data_format = 'channels_last'))(image_input)
pooling_1 = TimeDistributed(MaxPooling2D((2, 2), strides=(1, 1)(convolutional_1)

convolutional_2 = TimeDistributed(Conv2D(128, (4,4), activation='relu'))(pooling_1)
pooling_2 = TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2)))(convolutional_2)

convolutional_3 = TimeDistributed(Conv2D(256, (4,4), activation='relu'))(pooling_2)
pooling_3 = TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2)))(convolutional_3)

flatten_1 = TimeDistributed(Flatten())(pooling_3)
dropout_1 = TimeDistributed(Dropout(0.5))(flatten_1)

lstm_1, state_h, state_c = LSTM(256, return_sequences=True, return_state=True, stateful=False, dropout=0.5)(dropout_1)

dense_1 = TimeDistributed(Dense(num_classes, activation='sigmoid'))(lstm_1)

model = Model(inputs = [image_input, hidden_state_input, cell_state_input], outputs = [dense_1, state_h, state_c])

苹果文档链接: https://developer.apple.com/documentation/coreml/core_ml_api/making_predictions_with_a_sequence_of_inputs

使用类似方法的示例模型的GitHub存储库链接: https://github.com/akimach/GestureAI-CoreML-iOS

有关自定义调用函数的Keras GitHub帖子链接: https://github.com/keras-team/keras/issues/2995

1个回答

0

事实证明,在转换过程中,coremltools转换器会自动添加状态输入和输出。

参考Keras转换器_topology.py的第215行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接