用Python实现CNN长短期记忆网络!你也行

机器人圈 / 2018年07月07日 13:30

互联网+

图:pixabay

原文来源:https://machinelearningmastery.com/

作者:Jason Brownlee

「机器人圈」编译:嗯~阿童木呀、多啦A亮

大家应该都很清楚,诸如图像这样的具有空间结构的输入,是不能用标准的Vanilla LSTM来进行简单建模的。

卷积神经网络长期短期记忆网络或简称CNN LSTM,它是LSTM架构,是专门为诸如图像或视频等序列预测问题而设计的LSTM架构。

在这篇文章中,你将了解更多关于用以序列预测的CNN LSTM架构的详细信息。

阅读本文之后,你将会知道:

•用于序列预测的CNN LSTM模型架构的发展。

•适合用CNN LSTM模型进行处理的问题类型的示例。

•在Python中如何用Keras实现CNN LSTM架构。

一切准备就绪,开始启程吧。

CNN LSTM架构

CNN LSTM架构涵盖了使用卷积神经网络(CNN)层对输入数据结合LSTM架构进行特征提取,以支持序列预测。

CNN LSTM被开发用于视觉时间序列预测问题和从图像序列(例如视频)生成文本描述的应用。具体来说,问题包括以下几种:

•行为识别:生成图像序列中演示的行为的文本描述。

•图像描述:生成单个图像的文本描述。

•视频描述:生成图像序列的文本描述。

[CNN LSTM]是一类在空间和时间上都具有一定深度的模型,它可以灵活地应用于一系列涉及顺序输入和输出的视觉任务。

——2015《用于视觉识别和描述的长期循环卷积网络》https://arxiv.org/abs/1411.4389

其实这种架构最初被称为长期循环卷积网络或LRCN模型,尽管在此次课程中,我们将使用更通用的名称“CNN LSTM”来指代使用CNN作为前端的LSTM。

该架构主要用于生成图像的文本描述任务。其中最关键的是CNN的使用,它要在一个具有挑战性的图像分类任务中进行预训练,而这个任务被重新定义为用于标题生成问题的特征提取器。

将CNN用作图像“编码器”是很自然的,首先对它进行预训练,以用于图像分类任务,并使用最后一个隐藏层作为生成句子的RNN解码器的输入。

——2015《展示并讲述:神经图像字幕生成器》(https://arxiv.org/abs/1411.4555)

除此之外,该架构还被用于语音识别和自然语言处理问题,其中CNN用作音频和文本输入数据中的LSTM特征提取器。

这种架构非常适合于以下问题:

•在其输入中具有空间结构,例如图像中的2维结构或像素,或者是句子、段落以及文档中的单词的1维结构。

•在其输入中具有时间结构,例如视频中的图像顺序或文本中的单词,或者需要在文本描述中生成具有时间结构的输出,例如文本描述中的单词。

卷积神经网络长短期记忆网络的网络架构

用keras实现CNN LSTM

我们可以定义一个用Keras联合训练的CNN LSTM模型。

关于CNN LSTM的定义可以这样理解:在前端添加CNN层,然后在输出端添加具有密集层的LSTM层。

将此架构定义为是由两个子模型组成的是有帮助的:用于特征提取的CNN模型和用于在时间步长中解释特征的LSTM模型。

让我们在一个具有二维输入序列(我们将其假设为图像)的情境中来理解这两个子模型。

CNN模型

我们可以定义一个2D卷积网络,由Conv2D和MaxPooling2D层组成,并将其层叠到所需深度的堆叠中。

Conv2D将解释图像的快照(例如,小方块),池化层将合并或抽象解释。

例如,下面的代码片段可以读取具有1个通道(例如黑色和白色)的10×10像素图像。 Conv2D将以2×2快照读取图像,并输出图像的一个新的10×10的解释。MaxPooling2D将将解释池化为2×2块,将输出减少到5×5合并中。打散的层将采取单个5×5映射,并将其转换为25个元素的向量,为处理其他层做准备,例如用于预测输出的密度。

这对于图像分类和其他计算机视觉任务是有意义的。

LSTM模型

以上CNN模型只能处理单个图像,将其从输入像素转换为内部矩阵或向量表示。

我们需要跨多个图像重复此操作,并允许LSTM使用反向传播(BPTT)在输入图像的内部矢量表示的序列之间建立内部状态并更新权重。

在使用现有的预编程模型(如VGG)进行图像特征提取的情况下,CNN可以被固定。CNN可能没有受过训练,我们可能希望通过从多个输入图像到CNN模型的LSTM的反向传播误差来训练。

在这两种情况下,概念上,都存在一个CNN模型和一系列LSTM模型,每个时间步长一个。我们要将CNN模型应用于每个输入图像,并将每个输入图像的输出作为单个时间步长传递给LSTM。

我们可以通过将整个CNN输入模型(一层或更多层)缠绕在TimeDistributed层中来实现。该层实现了多次施加相同层或多层的期望结果。在这种情况下,将其多次应用到多个输入时间步骤,并向LSTM模型轮流提供一系列“图像解释”或“图像特征”。

我们现在有两个模型元素:让我们把它们放在一起

CNN LSTM模型

我们可以通过首先定义CNN层或层,将它们缠绕在TimeDistributed层中,然后定义LSTM和输出层,从而在Keras中定义CNN LSTM模型。

我们有两种方法定义模型,它们是等价的,只是品味不同而已。

你可以先定义CNN模型,然后通过将整个CNN层序列缠绕在TimeDistributed层中,将其添加到LSTM模型,如下所示:

另一种代替的方法,也许更容易阅读的方法是将时间分布图中的每个层缠绕在CNN模型中,将其添加到主模型中。

第二种方法的好处是,所有层都出现在拟合优度情况简报中,对目前来说这是最合适的。

当然,你可以根据自己的品味选择你喜欢的方法。

进一步阅读

如果你想进一步深入了解,本部分将提供更多关于该主题的资源。

CNN LSTM论文

•《用于视觉识别和描述的长期循环卷积网络2015(https://arxiv.org/abs/1411.4389)

•《展示并讲述:神经图像字幕生成器

2015年(https://arxiv.org/abs/1411.4555)

•《卷积式、长短期记忆、完全连接的深度神经网络2015(https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43455.pdf)

•《字符意识神经语言模型

2015(https://arxiv.org/abs/1508.06615)

•《卷积式LSTM网络:降水预报机器学习方法

2015年(https://arxiv.org/abs/1506.04214)

Keras API

•Conv2D Keras API

•MaxPooling2D Keras API

•Flatten Keras API

•TimeDistributed Keras API

帖子

•用于机器学习的卷积神经网络速成课程(http://machinelearningmastery.com/crash-course-convolutional-neural-networks/)

•LSTM循环神经网络与Keras的Python序列分类(http://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/)返回搜狐,查看更多

责任编辑:

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。