pytorch时空数据处理2——图像转文本/字幕Image-Captionning(一)

pytorch时空数据处理2——图像转文本/字幕Image-Captionning(一)

前言:pytorch入门学习链接深度学习入门前戏 文章内容主要参考翻译于:链接

最终目标

构建一个用于生成图像描述、字幕或标题的模型。为了更快实现目的,让我们将复现“Show, Attend, and Tell”这篇论文。这并不是目前最好的解决方案,但效果依旧让人满意。作者最初的实现可以在这里找到。这个模型学会了去何处寻找关注点,当一个字一个字生成标题时,我们能够通过可视化的看到模型的“目光”在图像上移动。其中的关键在于它的注意力机制,并允许它集中注意力在图像中与它接下来要说的单词最相关的部分。以下是在训练或验证过程中模型没有先验知识的测试图像上生成的一些标题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要技术概念

  • Image captioning 图像字幕
  • Encoder-Decoder 架构 编码器解码器架构:通常,一个生成序列的模型将使用一个编码器将输入编码成固定的形式,一个解码器将其逐字的解码回序列。
  • Attention 注意力:注意力网络在深度学习中被广泛使用,并且得到了充分的认同。这是一种让模型只选择它认为与手头任务相关的编码部分的方法。相同机制可以用于任何模型,其中编码器的输出在空间或时间上有多个点。在图像字幕中,可以认为某些像素比其他像素更重要。同样在对机器翻译之类的任务进行排序时,通常也会考虑一些单词比其他单词更重要。
  • Transfer Learning 迁移学习:这是通过在新模型中使用部分现有模型来借用现有模型的方式。这几乎总是比从头开始训练新模型(即一无所知)要更优。正如接下来要讲到的一样,我们通常可以根据手头的具体任务来微调这些已有的知识。例如,使用预先训练的单词嵌入是一个看似愚蠢但有效的例子。对于我们的图像字幕问题,我们将使用预先训练的编码器,然后根据需要对其进行微调。
  • Beam Search 波束搜索:这就是你不能让你的解码器懒惰的地方,简单地选择在每个解码步骤得分最高的单词,但这不是最优的选择。波束搜索对于任何语言建模问题都很有用,因为它可以找到最优的序列。(后续会详细说明过程)

模型实现概述

在本节中,我将介绍此模型的概述。如果已经熟悉它,可以直接阅读[下一篇博客](https://blog.csdn.net/u013398034/article/details/114163436)

Encoder

编码器将具有3个颜色通道的输入图像编码为具有“learned”通道的较小图像。这个较小的编码图像是原始图像中所有有用内容的汇总表示。由于我们要对图像进行编码,所以我们使用卷积神经网络(CNN)。

我们不需要从头开始训练编码器。为什么?因为已经有经过训练的CNN来表示图像。多年来,人们一直在建立模型,这些模型非常擅长将图像归类到一千种类别中的一种。理所当然,这些模型能够很好地捕捉到图像的本质。

我选择使用在ImageNet分类任务中训练的101分层残差网络,PyTorch中已经提供了该网络。如前所述,这是迁移学习的一个例子。因此可以选择对其进行微调以提高性能。

在这里插入图片描述
这些模型逐渐创建了原始图像的越来越小的表示形式,并且每个后续表示形式都更“learned”能力,有更多的通道。由我们的ResNet-101编码器产生的最终编码的大小为14x14,具有2048个通道,即20481414大小张量。

鼓励尝试其他经过预先培训的体系结构。这篇论文使用的是VGGnet,也是在ImageNet上预先训练的,但没有微调。无论哪种方式,修改都是必要的。由于这些模型中的最后一层或两层是线性层,并结合Softmax激活进行分类,因此我们将其去掉。(因为它不是需要的输出形式)

Decoder

解码器的工作是查看编码图像并逐字生成字幕。因为它正在生成一个序列,所以它需要是一个递归神经网络(RNN)。我们将使用LSTM(LSTM理解与代码实现)。
在没有注意的典型设置中,您可以简单地平均所有像素上的编码图像。然后,无论是否进行线性变换,您都可以将其作为第一个隐藏状态输入到解码器中,期间每个预测单词被用来生成下一个单词,最终生成字幕。
在这里插入图片描述
在需要注意的情况下,我们希望解码器能够在序列中的不同点查看图像的不同部分。例如,当一个人拿着足球时,解码器会知道要专注于足球!如下图所示
在这里插入图片描述
我们不会简单的使用平均值,而是使用所有像素的加权平均值,其中重要像素的权重较大。图像的该加权表示可以在每个步骤与先前生成的单词连接以生成下一个单词。

Attention

通常使用注意力网络计算这些像素点的权重。凭直觉,你会如何评估图像某一部分的重要性呢?我们需要知道到目前为止已经生成的序列,这样就可以查看图像并决定下一步需要描述什么。例如,在你提到一个人之后,宣布他拿着足球是合乎逻辑的。这正是注意力机制所做的——它能够考虑到目前为止生成的序列,并关注下一步需要描述的图像部分。
在这里插入图片描述

我们将使用软注意力,其中像素的权重加起来为1。如果我们的编码图像中有P个像素,则在每个时间步长t时间段内权重和为1。可以将整个过程解释为计算像素是生成下一个单词的位置的概率。

Putting it all together 结合以上细节实现模型

现在可能已经很清楚这次实现的联合网络是什么样子了。如下图所示:
在这里插入图片描述

  • 在编码阶段一旦编码器生成编码图像,我们就转换编码,为LSTM解码器创建初始隐藏状态h(和单元状态C)。
  • 在解码阶段:
    • 编码图像和先前的隐藏状态被用来为注意力网络中的每个像素生成权重。
    • 先前生成的字和编码的加权平均被馈送到LSTM解码器以生成下一个字。

Beam Search

我们使用线性层将解码器的输出转换为词汇表中每个单词的分数。

最直接和最贪婪的选择是选择得分最高的单词,并用它来预测下一个单词。但这并不是最优的,因为序列的其余部分取决于您选择的第一个单词。如果这个选择不是最好的,那么接下来的一切都是次优的。而且不只是第一个单词,序列中的每个单词都会对后面的单词产生影响。如果你在第一步选择第三个最好的词,在第二步选择第二个最好的词,以此类推,很可能会发生这种情况。这将是你能产生的最好的序列。如果我们在完全解码完成之前不能做出决定,并从一篮子候选序列中选择总得分最高的序列,那将是最好的。

波束搜索就是这样做的:

  • 在第一个解码步骤中,考虑前k个候选。 为这k个第一个单词中的每一个生成k个第二个单词。
  • 根据加法分数选择前k个[第一个单词,第二个单词]组合。
  • 对于这k个第二个单词中的每一个,选择k个第三个单词,选择前k个[第一个单词、第二个单词、第三个单词]组合。 在每个解码步骤中重复。
  • K个序列终止后,选择综合得分最高的序列。
    在这里插入图片描述
    如图中所示,一些序列(删除)可能会提前失败,因为它们在下一步无法到达顶部k。一旦k个序列(带下划线)生成< end >标记,因此我们选择得分最高的一个。

下一篇博客:代码实现与解析

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值