生成式LSTM网络,Encoder-Decoder LSTM网络,CNN LSTM(LRCN)网络建模介绍——长短期记忆(LSTM)系列_LSTM的建模方法(1)

导读

文中介绍了三种LSTM的建模应用,分别是生成式LSTM网络,Encoder-Decoder LSTM网络,CNN LSTM(LRCN)网络。

大致介绍了一下每种网络的建模方法和应用场景,这里仅做了解即可

原文链接:

生成式长短期记忆网络的介绍

生成模型

LSTM可以用作生成模型。

给定大量序列数据,例如文本文档,可以设计LSTM模型以学习语料库的一般结构属性,并且当给定种子输入时,可以生成代表原始语料库的新序列。

开发用于概括文本语料库的模型的问题在自然语言处理领域中被称为语言建模。语言模型可以在单词级别工作并且学习文档中的单词之间的概率关系,以便准确地完成句子并生成全新的句子。在最具挑战性的语言模型中,语言模型在角色级别工作,从角色序列中学习,并一次生成一个角色的新序列。

虽然更具挑战性,但字符级模型的附加灵活性允许生成新单词,添加标点符号以及生成文本数据中可能存在的任何其他结构。

语言建模是迄今为止生成LSTM最常研究的应用,可能是因为使用标准数据集可以量化和比较模型性能。这种方法已被用于生成一系列有趣的语言建模问题的文本,例如:

  • 生成维基百科文章(包括标记)。
  • 生成莎士比亚等伟大作家的片段。
  • 生成技术手稿(包括标记)。
  • 生成计算机源代码。
  • 生成文章标题。

结果的质量各不相同; 例如,标记或源代码可能需要手动干预才能呈现或编译。然而,结果令人印象深刻。

该方法还应用于不同的域,其中可获得大量现有序列信息,并且可以一次一步地生成新序列,例如:

  • 手写生成。
  • 音乐生成。
  • 语音生成。
  • 生成式LSTM架构

    生成型LSTM实际上不是架构,它更多地是关于LSTM预测模型学习内容以及如何使用模型的观点的变化。

    我们可以想象使用任何LSTM架构作为生成模型。在这种情况下,我们将使用简单的Vanilla LSTM。

                                                                  用于生成模型的Vanilla LSTM架构

    用于生成模型的Vanilla LSTM架构

    在字符级语言模型的情况下,所有可能字符的字母表是固定的。一个热编码用于学习输入序列和预测输出序列。

    使用一对一模型,其中针对每个输入时间步骤预测一步。这意味着输入序列可能需要专门处理以便被矢量化或格式化以有效地训练监督模型。

 

编码器 - 解码器LSTM介绍

 

编码器 - 解码器LSTM是一种递归神经网络,旨在解决序列到序列问题,有时称为seq2seq。

序列到序列预测问题具有挑战性,因为输入和输出序列中的项目数可以变化。例如,文本翻译和学习执行程序是seq2seq问题的例子。

 

序列到序列预测问题

序列预测通常涉及预测实值序列中的下一个值或输出输入序列的类标签。

这通常被构造为一个输入时间步长到一个输出时间步长(例如一对一)或多个输入时间步长到一个输出时间步长(多对一)类型序列预测问题的序列。

存在更具挑战性的序列预测问题类型,其将序列作为输入并且需要序列预测作为输出。这些被称为序列到序列预测问题,或简称为seq2seq。

使这些问题具有挑战性的一个建模问题是输入和输出序列的长度可能不同。假定存在多个输入时间步长和多个输出时间步长,则这种形式的问题被称为多对多类型序列预测问题。

编码器 - 解码器LSTM架构

已证明非常有效的seq2seq预测问题的一种方法称为编码器 - 解码器LSTM。

该架构由两个模型组成:一个用于读取输入序列并将其编码为固定长度矢量,第二个用于解码固定长度矢量并输出预测序列。这些模型的使用使该架构的名称为Encoder-Decoder LSTM,专门针对seq2seq问题而设计。

                                                           编码器 - 解码器LSTM模型体系结构

                                            编码器 - 解码器LSTM模型体系结构

 

在Keras中实现编码器 - 解码器LSTM

编码器 - 解码器LSTM可以直接在Keras深度学习库中实现。

我们可以认为模型由两个关键部分组成:编码器和解码器。

首先,输入序列一次向网络显示一个编码字符。我们需要一个编码级别来学习输入序列中的步骤之间的关系,并开发这些关系的内部表示。

可以使用一个或多个LSTM层来实现编码器模型。此模型的输出是固定大小的向量,表示输入序列的内部表示。该层中的存储器单元数定义了该固定大小的矢量的长度。

model = Sequential()
model.add(LSTM(..., input_shape=(...)))

解码器必须将输入序列的学习内部表示转换为正确的输出序列。

一个或多个LSTM层也可用于实现解码器模型。该模型从编码器模型的固定大小输出中读取。

与Vanilla LSTM一样,Dense层用作网络的输出。通过将Dense层包装在TimeDistributed包装器中,可以使用相同的权重输出输出序列中的每个时间步长。

model.add(LSTM(..., return_sequences=True))
model.add(TimeDistributed(Dense(...)))

但是有一个问题。

我们必须将编码器连接到解码器,它们不适合。

也就是说,编码器将产生2维输出矩阵,其中长度由层中的存储器单元的数量来定义。解码器是LSTM层,其期望[样本,时间步长,特征]的3D输入,以便产生由问题定义的某个不同长度的解码序列。

如果您尝试将这些碎片强制在一起,则会出现错误,指示解码器的输出为2D,并且需要向解码器输入3D。

我们可以使用RepeatVector图层来解决这个问题。该层简单地重复提供的2D输入多次以创建3D输出。

RepeatVector图层可以像适配器一样使用,以将网络的编码器和解码器部分组合在一起。我们可以将RepeatVector配置为对输出序列中的每个时间步重复一次固定长度向量。

model.add(RepeatVector(...))

把这些放在一起:

model = Sequential()
model.add(LSTM(..., input_shape=(...)))
model.add(RepeatVector(...))
model.add(LSTM(..., return_sequences=True))
model.add(TimeDistributed(Dense(...)))

总而言之,RepeatVector用作适配器,以使编码器的固定大小的2D输出适合解码器所期望的不同长度和3D输入。TimeDistributed包装器允许为输出序列中的每个元素重用相同的输出层。

CNN LSTM(LRCN)递归神经网络介绍

CNN长短期记忆网络或简称CNN LSTM是一种LSTM架构,专门用于具有空间输入的序列预测问题,如图像或视频。

CNN LSTM(LRCN)架构

CNN LSTM架构涉及使用卷积神经网络(CNN)层来对与LSTM组合的输入数据进行特征提取以支持序列预测。

CNN LSTM是针对视觉时间序列预测问题以及从图像序列(例如视频)生成文本描述的应用而开发的。具体来说,问题是:

  • 活动识别:生成在一系列图像中演示的活动的文本描述。
  • 图像描述:生成单个图像的文本描述。
  • 视频描述:生成图像序列的文本描述。

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

该架构用于生成图像的文本描述的任务。关键是使用在具有挑战性的图像分类任务上预先训练的CNN,该任务被重新用作字幕生成问题的特征提取器。

 

该体系结构还用于语音识别和自然语言处理问题,其中CNN用作音频和文本输入数据上的LSTM的特征提取器。

此体系结构适用于以下问题:

  • 在其输入中具有空间结构,例如2D结构或图像中的像素或句子,段落或文档中的单词的一维结构。
  • 在其输入中具有时间结构,诸如视频中的图像的顺序或文本中的单词,或者需要生成具有时间结构的输出,诸如文本描述中的单词。

                                                               卷积神经网络长短期记忆网络体系结构

                                             卷积神经网络长短期记忆网络体系结构

 

在Keras实施CNN LSTM

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

可以通过在前端添加CNN层,然后在输出上添加具有Dense层的LSTM层来定义CNN LSTM。

将此体系结构视为定义两个子模型是有帮助的:用于特征提取的CNN模型和用于跨时间步骤解释特征的LSTM模型。

让我们在一系列2D输入的背景下看一下这两个子模型,我们假设它们是图像。

CNN模型

作为复习,我们可以定义一个2D卷积网络,它由Conv2D和MaxPooling2D层组成,这些层被排列成所需深度的堆栈。

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

例如,下面的片段需要读入具有1个通道(例如黑色和白色)的10×10像素图像。Conv2D将以2×2快照读取图像,并输出一个新的10×10图像解释。MaxPooling2D将解释汇集为2×2块,将输出减少到5×5合并。Flatten图层将采用单个5×5贴图并将其转换为25个元素的矢量,准备用于处理其他图层,例如用于输出预测的Dense。

cnn = Sequential()
cnn.add(Conv2D(1, (2,2), activation='relu', padding='same', input_shape=(10,10,1)))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Flatten())

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

LSTM模型

上面的CNN模型仅能够处理单个图像,将其从输入像素变换为内部矩阵或矢量表示。

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

在使用现有的预训练模型(如VGG)从图像中提取特征的情况下,可以固定CNN。CNN可能未经过训练,我们可能希望通过将来自LSTM的错误反向传播到多个输入图像到CNN模型来训练它。

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

我们可以通过在TimeDistributed层中包装整个CNN输入模型(一层或多层)来实现这一点。该层实现了多次应用相同层的期望结果。在这种情况下,将其多次应用于多个输入时间步骤,并依次向LSTM模型提供一系列“图像解释”或“图像特征”以进行处理。

model.add(TimeDistributed(...))
model.add(LSTM(...))
model.add(Dense(...))

我们现在有了模型的两个元素; 让我们把它们放在一起。

CNN LSTM模型

我们可以在Keras中定义CNN LSTM模型,首先定义一个或多个CNN层,将它们包装在TimeDistributed层中,然后定义LSTM和输出层。

我们有两种方法可以定义相同的模型,只是在品味上有所不同。

您可以先定义CNN模型,然后将整个CNN层序列包装在TimeDistributed层中,将其添加到LSTM模型,如下所示:

# define CNN model
cnn = Sequential()
cnn.add(Conv2D(...))
cnn.add(MaxPooling2D(...))
cnn.add(Flatten())

# define LSTM model
model = Sequential()
model.add(TimeDistributed(cnn, ...))
model.add(LSTM(..))
model.add(Dense(...))

另一种可能更容易阅读的方法是在将CNN模型中的每个图层添加到主模型时将其包装在TimeDistributed图层中。

model = Sequential()
# define CNN model
model.add(TimeDistributed(Conv2D(...))
model.add(TimeDistributed(MaxPooling2D(...)))
model.add(TimeDistributed(Flatten()))

# define LSTM model
model.add(LSTM(...))
model.add(Dense(...))

第二种方法的好处是所有层都出现在模型摘要中,因此目前是首选。

  • 8
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值