【深度学习】:实验6布置,图像自然语言描述生成(让计算机“看图说话”)

清华大学驭风计划

因为篇幅原因实验答案分开上传,深度学习专栏持续更新中,期待的小伙伴敬请关注

实验答案链接http://t.csdnimg.cn/bA48U

有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~

案例 6 :图像自然语言描述生成(让计算机“看图说话”)
相关知识点: RNN Attention 机制、图像和文本数据的处理

1 任务和数据简介

本次案例将使用深度学习技术来完成图像自然语言描述生成任务,输入一张 图片,模型会给出关于图片内容的语言描述。本案例使用 coco2014 数据集 [1] ,包 含 82,783 张训练图片, 40,504 张验证图片, 40,775 张测试图片。案例使用 AndrejKarpathy[2] 提供的数据集划分方式和图片标注信息,案例已提供数据处理的脚本, 只需下载数据集和划分方式即可。 图像自然语言描述生成任务一般采用 Encoder-Decoder 的网络结构, Encoder 采用 CNN 结构,对输入图片进行编码, Decoder 采用 RNN 结构,利用 Encoder编码信息,逐个单词的解码文字描述输出。模型评估指标采用 BLEU 分数 [3] ,用来衡量预测和标签两句话的一致程度,具体计算方法可自行学习,案例已提供计算代码。

2 方法描述

模型输入

       图像统一到 256 × 256 大小,并且归一化到 [−1,1] 后还要对图像进行 RGB 三通道均值和标准差的标准化。语言描述标签信息既要作为目标标签,也要作为Decoder 的输入,以 <start> 开始, <end> 结束并且需要拓展到统一长度,例如 :
< 𝑠𝑡𝑎𝑟𝑡 > 𝑎 𝑡𝑎𝑏𝑙𝑒 𝑡𝑜𝑝𝑝𝑒𝑑 𝑤𝑖𝑡ℎ 𝑝𝑙𝑎𝑡𝑒𝑠 𝑜𝑓 𝑓𝑜𝑜𝑑 𝑎𝑛𝑑 𝑑𝑟𝑖𝑛𝑘𝑠 < 𝑒𝑛𝑑 > < 𝑝𝑎𝑑 > < 𝑝𝑎𝑑 >< 𝑝𝑎𝑑 > ⋯
        每个 token 按照词汇表转为相应的整数。同时还需要输入描述语言的长度, 具体为单词数加 2 (<start> <end>) ,目的是为了节省在 <pad> 上的计算时间。

Encoder

案例使用 ResNet101 网络作为编码器,去除最后 Pooling Fc 两层,并添加 了 AdaptiveAvgPool2d() 层来得到固定大小的编码结果。编码器已在 ImageNet 上预训练好,在本案例中可以选择对其进行微调以得到更好的结果。

Decoder

Decoder 是本案例中着重要求的内容。案例要求实现两种 Decoder 方式,分别对应这两篇文章[4][5] 。在此简要阐述两种 Decoder 方法,进一步学习可参考原文章。
       第一种 Decoder 是用 RNN 结构来进行解码,解码单元可选择 RNN LSTM,GRU 中的一种,初始的隐藏状态和单元状态可以由编码结果经过一层全连接层并做批归一化 (Batch Normalization) 后作为解码单元输入得到,后续的每个解码单元的输入为单词经过 word embedding 后的编码结果、上一层的隐藏状态和单元状态,解码输出经过全连接层和 Softmax 后得到一个在所有词汇上的概率分布,并由此得到下一个单词。Decoder 解码使用到了 teacher forcing 机制,每一时间步解码时的输入单词为标签单词,而非上一步解码出来的预测单词。训练时,经过与输入相同步长的解码之后,计算预测和标签之间的交叉熵损失,进行 BP反传更新参数即可。测试时由于不提供标签信息,解码单元每一时间步输入单词为上一步解码预测的单词,直到解码出<end> 信息。测试时可以采用 beam search 解码方法来得到更准确的语言描述,具体方法可自行学习。
       第二种 Decoder 是用 RNN 加上 Attention 机制来进行解码, Attention 机制做的是生成一组权重,对需要关注的部分给予较高的权重,对不需要关注的部分给予较低的权重。当生成某个特定的单词时,Attention 给出的权重较高的部分会在 图像中该单词对应的特定区域,即该单词主要是由这片区域对应的特征生成的。Attention 权重的计算方法为:
𝛼 = 𝑠𝑜𝑓𝑡𝑚𝑎𝑥 (𝑓𝑐 (𝑟𝑒𝑙𝑢(𝑓𝑐(𝑒𝑛𝑐𝑜𝑑𝑒𝑟_𝑜𝑢𝑡𝑝𝑢𝑡) + 𝑓𝑐(ℎ))))
其中 softmax() 表示 Softmax 函数, fc() 表示全连接层, relu() 表示 ReLU 激活函数,encoder_output 是编码器的编码结果, h 是上一步的隐藏状态。初始的隐藏状态和单元状态由编码结果分别经过两个全连接层得到。每一时间步解码单元的输入除了上一步的隐藏状态和单元状态外,还有一个向量,该向量由单词经过word embedding 后的结果和编码器编码结果乘上注意力权重再经过一层全连接层后的结果拼接而成。解码器同样使用 teacher forcing 机制,训练和测试时的流程与第一种 Decoder 描述的一致。

样例输出

第一种 Decoder 得到的结果仅包含图像的文字描述,如下图:
第二种 Decoder 由于有 Attention 机制的存在,可以得到每个单词对应的图片区域,如下图:

3 参考程序及使用说明

本次案例提供了完整、可供运行的参考程序,各程序简介如下:
create_input_files.py : 下载好数据集和划分方式后需要运行该脚本文件,会生成案例需要的 json hdf5 文件,注意指定输入和输出数据存放的位置。
datasets.py : 定义符合 pytorch 标准的 Dataset 类,供数据按 Batch 读入。
models.py : 定义 Encoder Decoder 网络结构,其中 Encoder 已提前定义好,无需自己实现。两种 Decoder 方法需要自行实现,已提供部分代码,只需将 #ToDo 部分补充完全即可。
solver.py : 定义了训练和验证函数,供模型训练使用。
train.ipynb : 用于训练的 jupyter 文件,其中超参数需要自行调节,训练过程中可以看到模型准确率和损失的变化,并可以得到每个 epoch 后模型在验证集上的 BLEU 分数,保存最优的验证结果对应的模型用于测试。
test.ipynb : 用于测试的 jupyter 文件,加载指定的模型,解码时不使用 teacher forcing,并使用 beam search 的解码方法,最终会得到模型在测试集上的 BLEU分数。
caption.ipynb : 加载指定模型,对单张输入图片进行语言描述,第一种Decoder 方法只能得到用于描述的语句,第二种 Decoder 方法同时可以获取每个单词对应的注意力权重,最后对结果进行可视化。
utils.py : 定义一些可能需要用到的函数,如计算准确率、图像可视化等。
环境要求: python pytorch, torchvision, numpy, nltk, tqdm, h5py, json, PIL,
matplotlib, scikit-image, scipy=1.1.0 等。

4 要求与建议

完成 models.py 文件中的 #To Do 部分,可参考第 2 部分中的介绍或原论文;
调节超参数,运行 train.ipynb ,其中 attention 参数指示使用哪种 Decoder ,分别训练使用两种不同 Decoder 的模型,可以分两个 jupyter 文件保存最佳参数和训练记录,如 train1.ipynb, train2.ipynb
运行 test.ipynb 得到两个模型在测试集上的 BLEU 分数,分别保留结果;
选择一张图片,可以是测试集中的,也可以是自行挑选的,对图片进行语言描述自动生成,分别保留可视化结果;
在参考程序的基础上,综合使用深度学习各项技术,尝试提升该模型在图像自然语言描述生成任务上的效果,如使用更好的预训练模型作为 Encoder ,或者提出更好的 Decoder 结构,如 Adaptive Attention 等;
完成一个实验报告,内容包括基础两个模型的实现原理说明、两个模型的最佳参数和对应测试集 BLEU 分数、两个模型在单个图片上的表现效果、自己所做的改进、对比分析两个基础模型结果的不同优劣。
禁止任何形式的抄袭,借鉴开源程序务必加以说明。

5 参考资料

[1] MS-COCO 数据集 : https://cocodataset.org/
[2] 划分方式与 caption 信息:
http://cs.stanford.edu/people/karpathy/deepimagesent/caption_datasets.zip
[3] https://en.wikipedia.org/wiki/BLEU
[4] Vinyals O, Toshev A, Bengio S, et al. Show and tell: A neural image caption
generator[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015:
3156-3164.
[5] Xu K, Ba J, Kiros R, et al. Show, attend and tell: Neural image caption generation with
visual attention[C]//International conference on machine learning. 2015: 2048-2057.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/382233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Web组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Web组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Web组件 提供具有网页显示能力的Web组件&#xff0c;ohos.web.webview提供web控制能…

网络的基本概念和socket编程

网络的基本概念 1.协议1.1 协议的基本概念1.2 常见的协议 2.分层模型2.1网络七层OSI 7层模型&#xff1a;物数网传会表应(口诀)2.2TCP/IP模型2.3数据通信的过程2.4网络的设计模式2.5以太网帧的格式 3.SOCKET编程3.1网络字节序3.2 相关结构体和函数3.3 代码实现 1.协议 1.1 协议…

2.9日学习打卡----初学RabbitMQ(四)

2.9日学习打卡 一.RabbitMQ 死信队列 在MQ中&#xff0c;当消息成为死信&#xff08;Dead message&#xff09;后&#xff0c;消息中间件可以将其从当前队列发送到另一个队列中&#xff0c;这个队列就是死信队列。而在RabbitMQ中&#xff0c;由于有交换机的概念&#xff0c;实…

《CSS 简易速速上手小册》第8章:CSS 性能优化和可访问性(2024 最新版)

文章目录 8.1 CSS 文件的组织和管理8.1.1 基础知识8.1.2 重点案例&#xff1a;项目样式表结构8.1.3 拓展案例 1&#xff1a;使用BEM命名规范8.1.4 拓展案例 2&#xff1a;利用 Sass 混入创建响应式工具类 8.2 提高网页加载速度的技巧8.2.1 基础知识8.2.2 重点案例&#xff1a;图…

MySQL-视图(VIEW)

文章目录 1. 什么是视图&#xff1f;2. 视图 VS 数据表3. 视图的优点4. 视图相关语法4.1 创建视图4.2 查看视图4.3 修改视图4.4 删除视图4.5 检查选项 5. 案例6. 注意事项 1. 什么是视图&#xff1f; MySQL 视图&#xff08; View&#xff09;是一种虚拟存在的表&#xff0c;同…

论文笔记:相似感知的多模态假新闻检测

整理了RecSys2020 Progressive Layered Extraction : A Novel Multi-Task Learning Model for Personalized Recommendations&#xff09;论文的阅读笔记 背景模型实验 论文地址&#xff1a;SAFE 背景 在此之前&#xff0c;对利用新闻文章中文本信息和视觉信息之间的关系(相似…

Java并发基础:LinkedBlockingQueue全面解析!

内容概要 LinkedBlockingQueue类是以链表结构实现高效线程安全队列&#xff0c;具有出色的并发性能、灵活的阻塞与非阻塞操作&#xff0c;以及适用于生产者和消费者模式的能力&#xff0c;此外&#xff0c;LinkedBlockingQueue还具有高度的可伸缩性&#xff0c;能够在多线程环…

剑指offer——替换空格

目录 1. 题目描述与背景1.1 题目描述1.2 背景 2. 一般思路 &#xff08;时间复杂度为O(n)&#xff09;3. 分析4. 完整代码4.1 标准答案 1. 题目描述与背景 1.1 题目描述 请实现一个函数&#xff0c;把字符串中的每个空格替换成 “ %20 ” 。例如&#xff1a;输入“ we are hap…

【Linux】学习-动静态库

动静态库 头文件与库的区别 头文件一般而言&#xff0c;是声明和宏定义。头文件是在预处理阶段使用的 库文件是已经编译好的二进制代码。是一种目标文件&#xff0c;库文件是在链接阶段使用的 对于头文件和库我们可以这样理解&#xff0c;就是头文件提供的是一个函数的声明&…

【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Turbo编码原理

目录 Turbo码&#xff1a;无线通信中的革命性技术 引言 一、Turbo码的基本原理 1.1 卷积码基础&#xff1a; 1.2 Turbo码的构造&#xff1a; 1.2.1 分量编码器 1.2.2 随机交织器 1.2.3 穿刺和复接单元 1.3 编码器结构的重要性和影响 1.4 迭代解码&#xff1a; 1.4.1 …

C#使用RabbitMQ-5_主题模式(主题交换机)

简介 主题模式允许发送者根据主题发布消息&#xff0c;而订阅者可以订阅特定的主题。 在主题模式中&#xff0c;生产者发送的消息被发送到一个交换机&#xff08;Exchange&#xff09;&#xff0c;该交换机根据消息的路由键&#xff08;Routing Key&#xff09;和绑定&#x…

springcloud分布式架构网上商城源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

React18原理: Fiber架构下的单线程CPU调度策略

概述 React 的 Fiber 架构, 它的整个设计思想就是去参考CPU的调度策略CPU现在都是多核多进程的&#xff0c;重点研究的是 CPU是单核单线程&#xff0c;它是如何调度的?为什么要去研究单线程的CPU&#xff1f; 浏览器中的JS它是单线程的JS 的执行线程和浏览器的渲染GUI 是互斥…

小兔鲜项目网页版

头部模块 <!-- 头部模块 --><header><!-- 快捷菜单模块 --><div class"xtx-shortcut"><!-- 版心的盒子 --><nav class"container"><ul class"fr"><li><a href"#">请先登录<…

前端JavaScript篇之对象继承的方式有哪些?

目录 对象继承的方式有哪些&#xff1f;1. 原型链继承2. 借用构造函数3. 组合继承4. 原型式继承5. 寄生式组合继承 对象继承的方式有哪些&#xff1f; 1. 原型链继承 当使用原型链继承时&#xff0c;子类型的原型对象被设置为父类型的一个实例。这意味着子类型通过其原型可以…

Python爬虫——请求库安装

目录 1.打开Anaconda Prompt 创建环境2.安装resuests3.验证是否安装成功4.安装Selenium5.安装ChromeDriver5.1获取chrom的版本5.1.1点击浏览器右上三个点5.1.2点击设置5.1.3下拉菜单&#xff0c;点击最后关于Chrome&#xff0c;获得其版本 5.2 打开网址 [chromedriver](https:/…

ADMap:Anti-disturbance framework for reconstructing online vectorized HD map

参考代码&#xff1a;ADMap 动机与出发点 局部地图构建算法在实际中会遇到部分车道线偏离的或是错误的情况&#xff0c;这往往是全局信息获取上存在欠缺&#xff0c;毕竟地图元素的回归很依赖于全局信息的获取。那么从特征提取、attention layer设计和loss构建上可以做一些工作…

qt-C++笔记之判断一个QLabel上有没有load图片

qt-C笔记之判断一个QLabel上有没有load图片 code review! 在Qt框架中&#xff0c;QLabel是用来显示文本或者图片的一个控件。如果你想判断一个QLabel控件上是否加载了图片&#xff0c;你可以检查它的pixmap属性。pixmap属性会返回一个QPixmap对象&#xff0c;如果没有图片被加…

基于springboot广场舞团管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

Linux中常用的工具

软件安装 yum 软件包 在Linux中&#xff0c;软件包是一种预编译的程序集合&#xff0c;通常包含了用户需要的应用程序、库、文档和其他依赖项。 软件包管理工具是用于安装、更新和删除这些软件包的软件。常见的Linux软件包管理工具包括APT&#xff08;Advanced Packaging To…