Tic商业评论

关注微信公众号【站长自定义模块】,定时推送前沿、专业、深度的商业资讯。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

  • QQ空间
  • 回复
  • 收藏

TensorFlow Sequence to Sequence 模型例子

lijingle 深度学习框架 2021-12-13 14:48 1885人围观

Sequence-to-sequence模型在NLP中特别流行.本文作为TensorFlow系列的一部分,将介绍Sequence-to-sequence模型的示例。


这些例子包括:

  1. 基于GRU的Shakespear文本生成
  2. attention Seq2seq语言翻译
  3. 基于视觉attention图像文字说明与 和Inception V3的特征提取。

基于GRU的Shakespear文本生成
给一个里面有Shakespear的作品的大文件,


我们可以用它的内容来训练一个像Shakespear一样的模型。

例如,在推理过程中,我们从一个初始文本开始,称为“Romeo:”。模型一次预测下一个字符是什么。


这可以通过下面的GRU模型来实现,embedding层和dense 层。下一个字符是在最后一个GRU单元格中预测的字符。


我们从一开始就用最初的文本来追踪它。最后一个单元格的logit输出将用于确定“Romeo:”之后的下一个字符。


我们再次将生成的字符作为模型的输入,并生成下一个字符。



当我们不断重复这个过程时,它会生成一个脚本,类似于下面的脚本。即使不是语法上的声音,它也可以用更复杂的设计来改进。现在,我们使用简单的模型


让我们回到代码。首先,我们加载Shakespear文件,并使用其独特的字符(65)形成一个词汇表(这个词汇表包含字符而不是单词)。然后,我们创建一个字符和一个整数索引之间的映射。


我们将下载的Shakespear文本中的字符转换为一个长序列的整数索引。我们对其进行切片和批处理,以创建数据集“序列”。接下来,我们创建一个包含第39行目标文本作为标签的附加字段的DataSet。


给定一个输入字符,目标文本中的对应字符(我们要预测的字符)应该是输入文本的下一个字符。因此,这些标签只是通过将输入左移一个来形成的。


然后,我们shuffle和batch数据集。


然后建立模型。


它包含一个embedding层、一个GRU和一个dense层。


下面是该模型的summary。


然后,我们训练模型并创建checkpoints。


接下来,我们从checkpoints重新加载模型。


恢复模型后,我们开始以Shapespear样式生成初始文本“ROMEO:”的文本


我们将此文本转换为相应的整数索引序列。然后,我们将其拟合到模型中,该模型输出形状为(1,7,65)的张量 logits。初始文本“ROMEO:”(批量大小、序列长度、词汇大小)中的每个输入字符都有一个预测。

在第140行中,我们使用 tf.random.categorical 在每个序列中使用logit值对字符预测进行采样。输出的形状为(7,1)。我们只对最后一个GRU单元(最后一个字符后面的下一个字符)感兴趣,因此我们将最后一个采样值[-1,0]作为下一个生成的字符。

对于“For”循环迭代的其余部分,我们只使用新生成的角色作为模型的输入,并预测下一个角色。我们重复迭代,直到生成1000个字符。


 attention Seq2seq 语言翻译

本例训练一个序列到序列(seq2seq)模型,用于西班牙语到英语的翻译。首先,我们下载数据集文件。以下是西班牙语到英语翻译文件的一部分。


接下来,我们创建方法来预处理一个句子。


给定一个翻译文件,create_dataset生成目标文本和原始文本的样本,并将文本转换为整数序列。


现在,load_dataset将它们放在一起,将源(西班牙语)和目标(英语)文本加载到源和目标整数序列的样本中。它还返回使用的标记化器。


以下是源文本和目标文本的整数序列示例。


以下是创建用于训练和验证的较小数据集的样例代码。


下图包含一个encoder,用于提取“Je suisétudiant”的输入上下文,以及一个decoder,用于将该上下文转换为“我是学生”。


但是我们的例子有一个额外的attention模块。在没有attention的情况下,解码器根据预测的字和最后一步的GRU隐藏状态预测下一个字。


注意,我们也使用输入上下文。但不是完整的输入上下文,我们使用最后一个GRU隐藏状态来选择我们应该注意的输入上下文部分。在计算机视觉中,我们利用注意力来掩盖当前阶段不重要的信息。


以下是在NLP中应用注意的概念可视化。如果我们使用第16个单词(Bank)作为查询,它将更加关注短语“bankofamerica”,而不是“river Bank”。


Encoder

这是编码器。它包含一个embedding层和一个GRU。


编码器产生“输出”,即完整序列的隐藏状态,“状态”,即最后一个隐藏状态。


我们进一步阐述注意力是如何工作的。query是解码器先前隐藏的GRU状态,值是编码器的输出。attention保持与query相关的输入上下文。


这是注意力模块的详细模型图。


我们示例中的“values”包含一个由3个整数向量组成的序列,表示输入“Je suisétudiant”。每个向量都有“hidden dim“。我们训练dense层(W1和W2)来抑制与query无关的向量。其输出通过一个tanh函数,并进一步训练,以对每个向量进行dense层V的评分。然后,scores通过一个softmax函数确定。序列中的每个向量与相应的softmax结果相乘。将根据当前query对模型进行训练,以消除输入序列中的无关向量。最后,我们将所有向量相加。注意输出即上下文向量将具有形状(batch size, hidden dimension)。以下是注意力模块的代码。


以及我们应用的公式。


最后,这是解码器。


在解码器的第二个step中,这里是上面代码中使用的符号


下面是定义的Adam优化器和损失函数。


以下是训练步骤


training itself:


在对模型进行训练后,我们可以对模型进行评估。评估步骤类似于训练,只是它使用先前的预测作为输入,而不是目标词。当我们预测<end>token时,该样本的输出就完成了。


最后,我们绘制了当我们翻译“hace mucho frio aqui”时在attention 模块中应用的权重。


图中显示了模型在不同阶段关注的上下文。在预测单词“cold”时,该阶段的输入上下文主要关注单词“frio”——西班牙语中的cold。


具有视觉attention和Inception V3 特征提取的图像字幕

在本例中,我们直接从图像生成图像标题。


同样,在生成下一个单词时,我们将应用注意机制来注意图像的较小区域。注意和解码器模块将类似于翻译示例。主要区别在于对数据进行预处理。我们将使用Inception v3模型提取图像特征并将其保存到文件中。编码器的输入将是这些提取的图像特征。我们将快速浏览代码,因为大多数部分与前面的翻译示例相似。

首先,我们下载包含标题和大约82000个MSCOCO图像(13GB)的注释文件。


但是为了更快的训练,我们只拍摄了6000张照片。并准备一份约30011个标题的列表和一份30011个相应文件名的列表。每个图像可以有多个标题。


我们将调整图像大小,并使用预构建的Inception v3来提取特征。然后将这些特征存储到一个文件中。


接下来,我们对字幕进行预处理和标记化。我们将为前5000个单词准备词汇表,并创建单词和单词整数索引之间的映射。我们还将所有序列填充到与最长序列相同的长度。


接下来,我们将在训练和验证之间划分样本。


我们将创建数据集。


attention模型将与讨论的相同


因为我们的输入已经是提取的特征,编码器只是一个简单的dense层,后面是ReLU。


解码器类似于语言翻译示例,有一个dense层和两个ReLU层。它还使用attention层。


我们定义了模型、Adam优化器、损失函数和Checkpoint管理器。


在训练步骤中,我们对提取的图像特征进行编码。然后,我们使用解码器,注意每次预测一个单词。


这是训练loop,


以及评估


所有源代码都源于或修改自TensorFlow教程。






路过

雷人

握手

鲜花

鸡蛋
我有话说......

TA还没有介绍自己。

电话咨询: 135xxxxxxx
关注微信