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

news2024/9/24 9:28:11

DL_class

学堂在线《深度学习》实验课代码+报告(其中实验1和实验6有配套PPT),授课老师为胡晓林老师。课程链接:https://www.xuetangx.com/training/DP080910033751/619488?channel=i.area.manual_search。

持续更新中。
所有代码为作者所写,并非最后的“标准答案”,只有实验6被扣了1分,其余皆是满分。仓库链接:https://github.com/W-caner/DL_classs。 此外,欢迎关注我的CSDN:https://blog.csdn.net/Can__er?type=blog。
部分数据集由于过大无法上传,我会在博客中给出下载链接。如果对代码有疑问,有更好的思路等,也非常欢迎在评论区与我交流~

实验6:图像自然语言描述生成(让计算机“看图说话”)

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 的输入,以开始,结束并且需要拓展到统一长度,例如:< 𝑠𝑡𝑎𝑟𝑡 > 𝑎 𝑡𝑎𝑏𝑙𝑒 𝑡𝑜𝑝𝑝𝑒𝑑 𝑤𝑖𝑡ℎ 𝑝𝑙𝑎𝑡𝑒𝑠 𝑜𝑓 𝑓𝑜𝑜𝑑 𝑎𝑛𝑑 𝑑𝑟𝑖𝑛𝑘𝑠 < 𝑒𝑛𝑑 > < 𝑝𝑎𝑑 > < 𝑝𝑎𝑑 >< 𝑝𝑎𝑑 > ⋯每个 token 按照词汇表转为相应的整数。同时还需要输入描述语言的长度,具体为单词数加 2 (,),目的是为了节省在上的计算时间。

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反传更新参数即可。测试时由于不提供标签信息,解码单元每一时间步输入单词为上一步解码预测的单词,直到解码出信息。测试时可以采用 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 分数、两个模型在单个图片上的表现效果、自己所做的改进、对比分析两个基础模型结果的不同优劣。
  • 禁止任何形式的抄袭,借鉴开源程序务必加以说明。

4 注意事项

  • 提交所有代码和一份案例报告,提交 test_results.json 文件;
  • 案例报告应详细介绍所有改进尝试及对应的结果(包括验证集 mAP 值和若 干检测结果示例图),无论是否成功提升模型效果,并对结果作出分析;
  • 禁止任何形式的抄袭,借鉴开源程序务必加以说明。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于JVM:内容以及流程释义

对于JVM、GC、类加载&#xff0c;很多人摸不清楚头绪&#xff0c;不知道他们之间的关系。误以为GC和类加载还有JVM区分统称垃圾回收&#xff0c;实则他们包含的东西很多&#xff0c;很细&#xff0c;完整的了解正个JVM的加载过程&#xff0c;就需要全面理解这些东西。 我认为的…

三节锂电池充电管理芯片,IC电路图,BOM物料表

5V输入升压&#xff0c;三节锂电池充电管理芯片&#xff0c;IC电路图和BOM物料表&#xff1b;20V输入降压&#xff0c;三节锂电池充电管理芯片&#xff0c;IC电路图和BOM物料表。 5V输入&#xff0c;三节锂电充电管理系统 1 5V输入升压&#xff0c;三节锂电池充电管理芯片 FS40…

实现网站都变成灰色-filter

如下&#xff1a;当某些情况发生时一些娱乐网站统一变成灰色系&#xff0c;全站的内容都变成灰色了&#xff0c;包括按钮、图片等等。 怎么实现的&#xff1f; 最简单的是考虑所有的内容都统一换了一个 CSS 样式&#xff0c;图片也全换成灰色的&#xff0c;按钮等样式也统一换…

Web3和区块链入门——Web3历史和Web3是什么?

大家好&#xff0c;我是无用&#xff0c;今天跟大家聊下Web3历史和Web3什么。 Web3历史 Web3.0一词最初由英国计算机科学家蒂姆伯纳斯-李&#xff08;著名的万维网之父&#xff09;在1998年提出&#xff0c;但是他那个时候所说的Web3.0是自己所提出的语义网络&#xff0c;他认为…

Newsletter 2022-11|HStreamDB 0.11 发布

11月我们发布了 HStreamDB 0.11&#xff0c;修复了多项已知问题。同时也在继续推进 HStream Platform 的开发&#xff0c;并计划于本月底上线首个 Alpha 版本。 v0.11 发布 随着云原生流数据库 HStreamDB 项目的日益成熟&#xff0c;为了更好地适应项目发展&#xff0c;我们决…

零基础入门推荐系统 - 新闻推荐 - 实操1

内容导航: 零基础入门推荐系统 - 新闻推荐 - 实操1赛题数据介绍:数据集介绍:读取数据集:零基础入门推荐系统 - 新闻推荐 - 实操1 赛题数据介绍: 赛题以预测用户未来点击新闻文章为任务&#xff0c;数据集报名后可见并可下载&#xff0c;该数据来自某新闻APP平台的用户交互数据…

torch.autograd

torch.autograd torch.autograd: 提供了类和函数&#xff0c;用来对任意的标量函数进行求导&#xff0c;要想使用自动 求导&#xff0c;只需要对已有的代码进行微小的改变&#xff0c;只需要将所有的tensor包含进VariableVariableVariable对象中即可。 torch.autograd.backwa…

2.2.2同向放大器、同向放大器的设计

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

unity——通过点击按钮进行场景切换

前记 通过点击鼠标进行场景切换请参考&#xff1a; Unity——通过点击鼠标进行场景切换_行秋的博客-CSDN博客通过点击按钮进行场景切换请参考&#xff1a;unity——通过点击按钮进行场景切换_行秋的博客-CSDN博客1.准备两个示例场景 2.点击File—>Build Settings...&#…

网页优化(布局优化、图片优化)

为什么页面优化&#xff1f; 页面扩展灵活提高页面的加载速度提高用户的体验 布局优化-高度自适应 自适应 1.宽高不写 注意:当子元素浮动时&#xff0c;父元素不写高度会引起高度塌陷 2.宽高写%单位 3.使用max-width/min-width/max-height/min-height 高度塌陷 清除高度塌…

Java基础语法纯小白入门

第二天内容&#xff1a; |___01.今日内容概述.mp4 |___02.数据类型转换_自动类型转换.mp4 |___03.数据类型转换_强制类型转换.mp4 |___04.数据类型转换注意事项.mp4 |___05.数据类型转换面试题.mp4 |___06.编码表简单概述.mp4 |___07.Java运算符_算术运算符.mp4 |___08…

【kafka】Timed out waiting for a node assignment

1.概述 在做flink任务的时候,报错 Timed out waiting for a node assignment 详细错误如下 2.源码 在SourceCoordinator中我们调用了start方法启动.启动方法主要做了2件事 创建Enumerator启动Enumerator

Machine Learning机器学习(学习记录)

Machine Learning机器学习 目录Machine Learning机器学习聚类K-Means基本思路k均值算法流程k均值算法的特点k-均值算法的优点&#xff1a;k-均值算法的缺点&#xff1a;sklearn实现KMeansK-Means算法基本思路代码实现K-MeansPython代码实现sklearn实现K-Means参考&#xff1a;聚…

[附源码]Python计算机毕业设计Django小太阳幼儿园学生管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

基于Intel Lake-UP3平台的超声设备方案设计,提供出色的图形和AI性能

超声系统要求 有效的超声系统可加快诊断速度&#xff0c;并帮助医生更快做出更有效的治疗决策。 为此&#xff0c;超声机器要求极高的处理性能和图形渲染效果以提高诊断准确性&#xff0c;并立即获取精确的图像。 类似地&#xff0c;还需要易于移动以适应不断变化的医疗场景和…

p1.第一章 基础入门 -- Python开发环境安装 (一)

1.基础入门 1.1 环境安装 1.1.1 windows环境安装 Python下载地址&#xff1a;https://www.python.org/downloads/ 1.1.1.1 python多版本安装 下载并安装3.6.8 下载Windows x86-64 executable installer&#xff0c;python 3.6.8下载地址&#xff1a;https://www.python.o…

章鱼网络社区治理的4种方式

全长1810字&#xff0c;预计阅读 8 分钟 作者&#xff1a;MiX 2021年10月8日章鱼网络主网启动的时候&#xff0c;创始人 Louis 曾代表核心团队承诺&#xff1a;用3年的时间让章鱼网络转化成一个完全由社区所有&#xff0c;并由社区管理的去中心化协议。 我们认为3年的过渡期是…

【Java】之Java8新特性

Java 基础系列的笔记终于完成了&#x1f389;&#x1f389;&#x1f389; 目录 一、Lambda 表达式 1. Lamdba 表达式概述 2. 使用 Lambda 表达式前后对比 3. 怎样使用Lambda表达式 4. Lamdba表达式总结 二、函数式接口 1. 函数式接口概述 3. Java内置函数式接口 4. 使…

我是怎么从软件测试转到自动化测试岗的?亲身经历分享

相信很多人接触软件测试岗位&#xff0c;都纯功能界面的测试&#xff0c;我也不例外。那个时候是在一广州一家电商公司做测试&#xff0c;做了也有一段时间&#xff0c;熟悉了产品业务流程以及熟练测试工作流程规范之后&#xff0c;效率提高了&#xff0c;工作比较轻松&#xf…

电子电气架构设计需要考虑哪些方面?

当前车辆日益复杂&#xff0c;车联网功能在各个细分领域都在不断增加&#xff0c;而更强大的智能功能也逐步增加。 所有这些高级功能都依赖于线束和控制器才能发挥作用。然而面对日益增加的车辆复杂性和产品开发周期缩短的压力&#xff0c;导致汽车制造商和系统集成商的成本和…