python - 创建 CoreML LRCN 模型

标签 python ios keras recurrent-neural-network coreml

您好,在此先感谢您或提供的任何帮助或指导!

我的问题源于 Apple 的 CoreML 文档网站上发布的一篇文章。这篇文章的主题在 WWDC 2017 的讲座中也有涉及,我觉得它很有趣。我最近发布了一个问题,该问题与我正在从事的同一项目的一部分有关,并且很容易解决;然而,随着我进一步深入这项工作,我发现自己并不了解该模型的一部分是如何实现的。

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

我训练和部署这个网络的计划可能会引发其他问题,但如果它们造成麻烦,我会单独发帖。它涉及使用时间分布式包装器进行训练,然后将其从模型中剥离并在 CoreML 转换时为包装层加载权重,因为时间分布式包装器不能很好地与 CoreML 配合使用。

我的问题是:

在上述文章(以及我在 GitHub 上找到的 CormeML 示例项目)中,实现非常巧妙。由于 CoreML(或至少是常用转换器)不支持图像序列作为输入,因此一次输入一个图像,并且 LSTM 状态作为输出与输入图像的预测一起传出网络。对于序列中的下一张图像,用户将图像连同前一个时间步长的 LSTM 状态一起传递,这样模型就可以“从停止的地方开始”,可以说并将单个输入作为一个序列来处理。它有点形成 LSTM 状态的循环(这在 Apple 文章中有更详细的介绍)。现在,对于实际问题部分......

这是如何在像 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])

Apple 文章链接: 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

最佳答案

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

Keras 转换器 _topology.py,第 215 行供引用。

关于python - 创建 CoreML LRCN 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48492613/

相关文章:

objective-c - 在哪里设置弹出窗口大小?

python - 使用 InceptionV3 的 MNIST 的错误输入形状

python - Pandas 将所有列的值连接到一个新的列列表中

python - 未安装错误: TfidfVectorizer - Vocabulary wasn't fitted

python - 从 tweepy 异常实例中获取错误代码

tensorflow - Tensorflow 中的矢量移位(滚动)

python - 如何防止丢失 : nan while I'm fitting my keras model?

python - 简单的正则表达式问题

ios - WatchConnectivity 试图将数据发送到 Watch 应用程序

ios - 如何以编程方式创建具有多个占位符的多行 UITextfield?