所有文章 > 正文

博士带你学LSTM|怎么开发一个LSTM模型来生成形状?(附代码)

作者: 邵洲

时间: 2019-03-04 14:22

LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要事件。在自然语言处理、语言识别等一系列的应用上都取得了很好的效果。

《Long Short Term Memory Networks with Python》是澳大利亚机器学习专家Jason Brownlee的著作,里面详细介绍了LSTM模型的原理和使用。

该书总共分为十四个章节,具体如下:

第一章:什么是LSTMs?

第二章:怎么样训练LSTMs?

第三章:怎么样准备LSTMs的数据?

第四章:怎么样在Keras中开发LSTMs?

第五章:序列预测建模

第六章:如何开发一个Vanilla LSTM模型?

第七章:怎么样开发Stacked LSTMs?

第八章:开发CNN LSTM模型(本期内容)

第九章:开发Encoder-Decoder LSTMs

第十章:开发Bidirectional LSTMs

第十一章:开发生成LSTMs(本期内容)

第十二章:诊断和调试LSTMs(下周一发布)

第十三章:怎么样用LSTMs做预测?

第十四章:更新LSTMs模型

本文的作者对此书进行了翻译整理之后,分享给大家,本文是第十期内容。

第一期内容为:一万字纯干货|机器学习博士手把手教你入门LSTM(附代码资料)

第二期内容为:干货推荐|如何基于时间的反向传播算法来训练LSTMs?

第三期内容为:干货推荐|如何准备用于LSTM模型的数据并进行序列预测?(附代码)

第四期内容为:机器学习博士带你入门|一文学会如何在Keras中开发LSTMs(附代码)

第五期内容为:初学者如何避免在序列预测问题中遇到的陷阱?

第六期内容为:如何开发和评估Vanilla LSTM模型?

第七期内容为:博士带你学LSTM|怎么样开发Stacked LSTMs?(附代码)

第八期内容为:博士带你学LSTM|手把手教你开发CNN LSTM模型,并应用在Keras中(附代码)

第九期内容为:博士带你学LSTM|开发Encoder-Decoder LSTM模型的简单教程(附代码)

第十期内容为:博士带你学LSTM|开发Bidirectional LSTM模型的简单教程(附代码)

我们还将继续推出一系列的文章来介绍里面的详细内容,和大家一起来共同学习,支持答疑!支持答疑!支持答疑!重要的事情说三遍!您在学习过程中遇到相关问题,都可在文章底部给我们留言!一定会回复你的!

本文有14000字左右,阅读需25分钟,建议收藏学习。

11.0 前言

11.0.1 课程目标

本课程的目标是学习怎么样开发LSTMs。完成本课程之后,你将会学习到:

  • LSTMs怎么样可以被用于生成模型;
  • 怎么样把形状绘制作为序列生成问题;
  • 怎么开发一个LSTM模型来生成形状。

11.0.2 课程概览

本课程被分为7个部分。它们是:

  1. Generative LSTM;
  2. 形状生成问题;
  3. 定义和编译模型;
  4. 拟合模型;
  5. 用模型做预测;
  6. 评估模型;
  7. 完成例子。

让我们开始吧!

11.1 Generative LSTM

11.1.1 生成模型

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

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

尽管有更多的挑战,一个字符级模型添加的灵活性允许新的字符被生成,增加标点符号,并且生成文本数据中可能存在的任何其他结构。

语言建模是目前为止研究最多的Generative LSTM应用,可能是因为使用标准数据集可以对模型性能进行量化和比较。这种方法以及被用来在一组有趣的语言建模问题上生成文本,例如:

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

结果的质量各不相同,例如,标记或源代码可能需要人工干预来渲染或编译。然而,结果令人印象深刻。该方法也已应用于不同的领域,其中现在的序列信息的大语料库是可用的,并且可以一步一步生成新的序列,例如:

  • 手写体生成;
  • 音乐生成;
  • 语音生成;

11.1.2 结构和实现

一个Generative LSTM不是真正的体系结构,它更多地是关于LSTM预测模型学习和使用模型的角度的改变。我们可以想象地使用任何LSTM体系结构作为生成模型。在这种情况下,我们使用一个简单的Vanilla LSTM。

在字符级语言模型的情况下,所有可能字符的字母都是固定的。一个one hot编码既用于学习输入序列,又用于预测输出序列。一个一对一的模型用于预测每个输入时间步长的一个步骤。这意味着输入序列可能需要专门的处理,以便被矢量化或格式化,以便有意识地训练有监督的模型。例如,给定序列:

一个数据集可能需要被构建成例如:


这可以作为一个时间步长样本的数据集来呈现,这可以相当限制网络(例如,没有BPTT)。或者,它可以被矢量化为many-to-one个时间步长模型的固定长度的输入序列,例如:

或者这些方法的一些变化。注意,在进行预测时,需要相同的矢量化表示,这意味着预测的字符将需要作为后续样本的输入。这在实现上可能是相当笨拙的。网络的内部形状可能需要仔细管理,可能在输入序列中的选择位置(例如段落、页面或章节结束)重置,而不是在每个输入序列的末尾重置。

11.2 形状生成问题

我们可以将产生随机形状的问题分解为序列生成问题。我们可以把一个矩形化成顺时针方向的点序列,在二维空间中有4个点:

  • Bottom Left(BL):[0, 0]
  • Bottom Right(BR):[1, 0]
  • Top Right(TR):[1, 1]
  • Top Left(TL):[0, 1]

每个坐标可以作为一个时间步长,x轴和y轴中的每一个代表单独的特征。从[0, 0]开始,任务是绘制具有一致宽度和高度的矩形的其余4个点。我们将把这个问题看做是一个坐标生成问题,例如one-to-one序列预测问题。给定坐标,预测下一个坐标。然后给定在最后一步预测的坐标,预测下一个坐标等扥。

我们可以通过生成随机矩阵来训练模型,并使模型预测后续坐标。从[0, 0]预测第一坐标是不可能的,并且从宽度预测高度也是不可能的,但是我们相信,只要重复暴露于整个矩形,模型就可以学习如何绘制具有一致宽度和高度的新矩形。在Python中实现这一过程涉及三个步骤:

  1. 生成随机矩形;
  2. 绘制矩形;
  3. 矩形到序列;

11.2.1 生成随机矩形

我们可以使用random()函数来生成0到1之间的随机数。给定一个矩形,我们可以使用random()函数来定义矩形的宽度和高度。

下面的函数,叫做random_rectangle(),产生了一个随机矩阵并返回一个二维点的列表。

运行示例创建一个随机矩阵并打印出坐标。你生成的特定的随机矩阵将有所不同。

11.2.2 显示矩阵

我们选择一个二维形状生成,主要是因为我们可以可视化结果。因此,我们需要一种容易地绘制矩形的方法,它要么随机生成,要么由模型预测。我们可以使用Matplotlib库来绘制坐标路径。

这涉及为形状定义一个路径,包括坐标列表和路径移动的形状。坐标列表将是我们随机生成的坐标列表,其中添加第一个坐标到列表的末尾以闭合多边形。路径是一系列的运动,如MOVETO指令启动序列,LINETO指令连接点,以及CLOSEPOLY指令来闭合多边形。

我们可以从路径定义一个PathPatch并将其直接在Matplotlib画图上画出来。

下面的函数叫做plot_rectangle()将一个4个矩形点的列表作为输入,并绘制并显示该图。轴的边界被调整以确保形状在0-1的范围内很好地被保持。

运行例子生成一个随机矩形并将其绘制到屏幕上。生成的特定矩形将在每次代码运行时发生变化。

11.2.3 矩阵到序列

最后,我们需要将2D坐标的序列从随机生成的矩形转换成我们可以用来训练LSTM模型的东西。给定矩形的4个点的序列:

我们可以生成具有1个时间步长和一个特征的3个例子,如下:

11.3 定义和编译模型

现在我们已经准备好了一个LSTM模型来解决形状预测的问题。该模型将预期1个时间步长输入,每一个具有2个特征的x坐标轴和y坐标轴。我们将在LSTM隐藏层中使用10个存储单元。大容量则不需要管这个问题,10个单元的设定是从一次次的尝试和错误中来的。

网络的输出是由x和y值组成的单个坐标。我们将使用具有2个神经元和线性激活函数的Dense层。

该模型最小化了平均绝对误差(mae)损失函数,并利用Adam优化算法对网络权值进行了计算。下面列出了完成的模型的定义。

运行例子打印模型结构的总结。我们可以看到模型确实是很小的。

11.4 拟合模型

该模型可以通过一次生成一个序列并使用它们来更新模型权重来拟合。每个序列由3个样本组成,在该模型的末尾,模型权重将被更新,并且每个LSTM单元的内部状态将被重置。这允许模型的内存集中在每个二进制序列的特定输入值上。生成的样本数代表训练周期epoch的代理;在这里,我们将使用25000个随机生成的矩形点序列。这种配置是在经过一次次的实验和反复尝试后发现的。样本的顺序很重要,因此样本的混洗被关闭。

11.5 用模型进行预测

一旦模型拟合,我们就可以使用它来生成新的矩形。我们可以用通过将矩形的起点定义为[0, 0],以此作为输入来获得下一个预测坐标。这是矩形的宽度。

然后,我们可以使用预测坐标作为输入来预测下一点。这将定义矩形的高度。

然后,该过程再重复一次,以产生剩余的坐标,该坐标预期与已经在第三点中定义的宽度和高度保持一致。下面的函数名generate_rectangle()包裹了这个函数,并使用拟合模型生成一个新的矩形,然后返回点列表。

我们可以使用这个函数来进行预测,然后使用先前定义的函数plot_rectangle()来显示结果。

运行例子生成一个矩形并将其显示在屏幕上。我们可以看到,矩形在宽度和高度的比例保持一致上确实做了很合理的工作。生成的特定矩形将在每次代码运行时发生变化。

11.6 评估模型

评估一个Generative LSTM模型是困难的。在这种情况下,我们对生成的形状(矩形)有很好的期望,可以定量和定性地进行评价。在许多问题中,情况困难并非如此,你可能不得不依靠定性的评价。

我们可以通过可视化实现对矩形的定性评价。一下是在不同的数量的训练之后生成的矩形的示例,以显示随着训练例子的增肌,模型的学习能力的定性改进。

11.7 完整例子

完整的代码列表提供如下给你做参考:

11.8 扩展阅读

本章节提供了一些用于扩展阅读的资源。

11.8.1 论文

-Generating Text with Recurrent Neural Networks, 2011.

  • Generating Sequences With Recurrent Neural Networks, 2013.
  • TTS Synthesis with Bidirectional LSTM based Recurrent Neural Networks, 2014.
  • A First Look at Music Composition using LSTM Recurrent Neural Networks, 2002.
  • Jazz Melody Generation from Recurrent Network Learning of Several Human Melodies, 2005.

11.8.2 文章

  • The Unreasonable Effectiveness of Recurrent Neural Networks, 2015.

11.8.3 APIs

  • Python random API.
  • Matplotlib Path API.
  • Matplotlib Patch API.

11.9 扩展

你想更加深入地了解Generative LSTM吗?本章节列出了本课中一些具有挑战性的扩展。

  • 列出5个其他问题的例子,而不是其他的语言模型,Generative LSTM可以被使用。
  • 设计并执行实验以比较模型大小(神经元数)与定性模型学习能力(图像)。
  • 更新示例,使得随机矩阵由更多的点组成(例如,在中间宽度的点和矩形的中高度),然后调谐LSTM以获得良好的技能。
  • 开发一个函数来估计矩形误差在宽度和高度不一致的情况下,在拟合生成LSTM时用作损失函数和度量。
  • 更新示例以学习不同的形状,例如圆、星型或十字。

11.10 总结

在本课程中,我们学习到了怎么样开发一个Generative LSTM模型。特别地,你学习到了:

  • LSTMs怎么样可以被用于生成模型;
  • 怎么样把形状绘制作为序列生成问题;
  • 怎么开发一个LSTM模型来生成形状。

在下一课中,你将会学到怎么样充分利用LSTM模型。

[关于转载]:本文为“学术头条”原创文章。转载仅限全文转载并保留文章标题及内容,不得删改、添加内容绕开原创保护,且文章开头必须注明:转自“SciTouTiao”微信公众号。谢谢您的合作。

二维码 扫码微信阅读
推荐阅读 更多