使用注意力机制给图片取标题 (tensorflow2.0官方教程翻译)

给定如下图像,我们的目标是生成一个标题,例如“冲浪者骑在波浪上”。

Man Surfing

在这里,我们将使用基于注意力的模型。这使我们能够在生成标题时查看模型关注的图像部分。

Prediction

模型体系结构类似于论文Show, Attend and Tell: Neural Image Caption Generation with Visual Attention.

本教程是一个端到端的例子。当您运行时,它下载 MS-COCO 数据集,使用Inception V3对图像子集进行预处理和缓存,训练一个编解码器模型,并使用训练过的模型对新图像生成标题。

在本例中,您将使用相对较少的数据来训练模型,大约20,000张图像对应30,000个标题(因为数据集中每个图像都有多个标题)。

导入库

1. 下载并准备MS-COCO数据集

您将使用MS-COCO数据集来训练我们的模型。该数据集包含超过82,000个图像,每个图像至少有5个不同的标题注释。下面的代码自动下载并提取数据集。 注意:训练集是一个13GB的文件。

2. (可选)限制训练集的大小以加快训练速度

对于本例,我们将选择30,000个标题的子集,并使用这些标题和相应的图像来训练我们的模型。与往常一样,如果您选择使用更多的数据,标题质量将会提高。

3. 使用InceptionV3预处理图像

接下来,我们将使用InceptionV3(在Imagenet上预训练)对每个图像进行分类。我们将从最后一个卷积层中提取特征。

首先,我们需要将图像转换成inceptionV3期望的格式:

4. 初始化InceptionV3并加载预训练的Imagenet权重

现在您将创建一个 tf.keras 模型,其中输出层是 InceptionV3 体系结构中的最后一个卷积层。该层的输出形状为 8x8x2048 。使用最后一个卷积层是因为在这个例子中使用了注意力。您不会在训练期间执行此初始化,因为它可能会成为瓶颈。

5. 缓存从InceptionV3中提取的特性

您将使用InceptionV3预处理每个映像并将输出缓存到磁盘。缓存RAM中的输出会更快但内存密集,每个映像需要 8 * 8 * 2048 个浮点数。在撰写本文时,这超出了Colab的内存限制(目前为12GB内存)。

可以通过更复杂的缓存策略(例如,通过分割图像以减少随机访问磁盘 I/O)来提高性能,但这需要更多代码。

使用GPU在Clab中运行大约需要10分钟。如果您想查看进度条,可以: 使用GPU在Colab中运行大约需要10分钟。如果你想看到一个进度条,你可以:

for img, path in image_dataset:

to:

for img, path in tqdm(image_dataset):.

6. 对标题进行预处理和标记

7. 将数据分解为训练和测试

8. 创建用于训练的tf.data数据集

我们的图片和标题已准备就绪!接下来,让我们创建一个tf.data数据集来用于训练我们的模型。

9. 模型

有趣的事实:下面的解码器与 注意神经机器翻译的示例中的解码器相同。

模型架构的灵感来自论文 Show, Attend and Tell

10. Checkpoint 检查点

11. 训练

 

png

12. 标题!

png

png

 

13. 在你自己的图片上试试

为了好玩,下面我们提供了一种方法,您可以使用我们刚刚训练过的模型为您自己的图像添加标题。请记住,它是在相对少量的数据上训练的,您的图像可能与训练数据不同(因此请为奇怪的结果做好准备!)

png

png

下一步

恭喜!您刚刚训练了一个注意力机制给图像取标题的模型。接下来,看一下这个使用注意力机制的神经机器翻译示例。它使用类似的架构来翻译西班牙语和英语句子。您还可以尝试在不同的数据集上训练此笔记本中的代码。

最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-text-image_captioning.html 英文版本:https://tensorflow.google.cn/beta/tutorials/text/image_captioning 翻译建议PR:https://github.com/mashangxue/tensorflow2-zh/edit/master/r2/tutorials/text/image_captioning.md