cs231n assignment3 q3 Image Captioning with Transformers

文章目录

  • 先啰嗦直接看代码
  • Q3 Image Captioning with Transformers
    • MultiHeadAttention.forward
      • 题面
      • 解析
      • 代码
      • 输出
    • Positional Encoding
      • 题面
      • 解析
      • 代码
      • 输出
    • transformer.forward
      • 题面
      • 解析
      • 代码
      • 输出

先啰嗦直接看代码

Q3 Image Captioning with Transformers

MultiHeadAttention.forward

题面

在这里插入图片描述
在这里插入图片描述

解析

让我们实现多头注意力的前向计算

可以先看看这篇李沐老师对transformer的讲解

如果你看了上面的这个视频,那么你应该能大概明白多头注意力是个什么东西
然后我们来看init部分的代码
在这里插入图片描述

首先多头注意力让我们对单纯的注意力的Q,K,V,计算的时候进行了投影,那么具体的投影方法,就是上面定义的

  1. self.key 投影key
  2. self.query 投影query
  3. self.value 投影 value

我们可以看到,这几个线性层的输入输出维度是相同的,接下来只需要计算单纯的权重就好了,如果看不懂我的解析,可以看我的代码注释,同时建议看看上面那个链接的视频

代码

    def forward(self, query, key, value, attn_mask=None):"""Calculate the masked attention output for the provided data, computingall attention heads in parallel.In the shape definitions below, N is the batch size, S is the sourcesequence length, T is the target sequence length, and E is the embeddingdimension.Inputs:- query: Input data to be used as the query, of shape (N, S, E)- key: Input data to be used as the key, of shape (N, T, E)- value: Input data to be used as the value, of shape (N, T, E)- attn_mask: Array of shape (S, T) where mask[i,j] == 0 indicates tokeni in the source should not influence token j in the target.Returns:- output: Tensor of shape (N, S, E) giving the weighted combination ofdata in value according to the attention weights calculated using keyand query."""N, S, E = query.shapeN, T, E = value.shape# Create a placeholder, to be overwritten by your code below.output = torch.empty((N, S, E))############################################################################# TODO: Implement multiheaded attention using the equations given in       ## Transformer_Captioning.ipynb.                                            ## A few hints:                                                             ##  1) You'll want to split your shape from (N, T, E) into (N, T, H, E/H),  ##     where H is the number of heads.                                      ##  2) The function torch.matmul allows you to do a batched matrix multiply.##     For example, you can do (N, H, T, E/H) by (N, H, E/H, T) to yield a  ##     shape (N, H, T, T). For more examples, see                           ##     https://pytorch.org/docs/stable/generated/torch.matmul.html          ##  3) For applying attn_mask, think how the scores should be modified to   ##     prevent a value from influencing output. Specifically, the PyTorch   ##     function masked_fill may come in handy.                              ############################################################################## *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****# 投影QKVQ = self.query(query)K = self.key(key)V = self.value(value)# 获取投影个数H = self.n_head# 获取投影维度D = self.head_dim# 矩阵分割 与 转置 这里需要结合QKV的形状来理解Q = Q.reshape(N, S, H, D).transpose(1, 2)  # (N H S D)K = K.reshape(N, T, H, D).transpose(1, 2)  # (N H T D)V = V.reshape(N, T, H, D).transpose(1, 2)  # (N H T D)# 矩阵乘法算权重  (N, H, S, K) * (N, H, K, T) -> N, H, S, Tenergy = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(D)  # (N H S T)# 判断是否需要maskif attn_mask is not None:energy = energy.masked_fill(attn_mask == 0, float('-inf'))# softmax计算A = torch.softmax(energy, dim=3)  # 对第四维度进行softmax# 使用dropoutA = self.attn_drop(A)# 计算加权和  (N, H, S, T) * (N, H, T, K) -> (N, H, S, K)Y = A.matmul(V)# 再投影回去Y = Y.transpose(1, 2).reshape(N, S, E)  # (N, S, E)output = self.proj(Y)  # (N, S, E)# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****#############################################################################                             END OF YOUR CODE                             #############################################################################return output

输出

在这里插入图片描述

Positional Encoding

题面

在这里插入图片描述
因为transformer能够很容易的主要的输入的任何部分,但是注意力机制没有顺序的概念,但是,对于许多人物,尤其是自然语言处理任务,顺序非常重要,因此作者添加了位置标记对每个单词的token

定于矩阵p为
在这里插入图片描述

我们并不直接把x输入进网络,而是将 x + p输入进来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解析

看懂上面的题面,就好了,还不懂就看代码

代码

class PositionalEncoding(nn.Module):"""Encodes information about the positions of the tokens in the sequence. Inthis case, the layer has no learnable parameters, since it is a simplefunction of sines and cosines."""def __init__(self, embed_dim, dropout=0.1, max_len=5000):"""Construct the PositionalEncoding layer.Inputs:- embed_dim: the size of the embed dimension- dropout: the dropout value- max_len: the maximum possible length of the incoming sequence"""super().__init__()self.dropout = nn.Dropout(p=dropout)assert embed_dim % 2 == 0# Create an array with a "batch dimension" of 1 (which will broadcast# across all examples in the batch).pe = torch.zeros(1, max_len, embed_dim)############################################################################# TODO: Construct the positional encoding array as described in            ## Transformer_Captioning.ipynb.  The goal is for each row to alternate     ## sine and cosine, and have exponents of 0, 0, 2, 2, 4, 4, etc. up to      ## embed_dim. Of course this exact specification is somewhat arbitrary, but ## this is what the autograder is expecting. For reference, our solution is ## less than 5 lines of code.                                               ############################################################################## *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****# 创建一个 0 到 maxlen 的行向量并转为列向量 就相当于公式里的icol = torch.arange(max_len)[:, None]# 获取公式中的矩阵的行向量row = torch.pow(10000, -torch.arange(0, embed_dim, 2) / embed_dim)# 计算p 矩阵pe[0, :, 0::2] = torch.sin(col * row)pe[0, :, 1::2] = torch.cos(col * row)# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****#############################################################################                             END OF YOUR CODE                             ############################################################################## Make sure the positional encodings will be saved with the model# parameters (mostly for completeness).self.register_buffer('pe', pe)def forward(self, x):"""Element-wise add positional embeddings to the input sequence.Inputs:- x: the sequence fed to the positional encoder model, of shape(N, S, D), where N is the batch size, S is the sequence length andD is embed dimReturns:- output: the input sequence + positional encodings, of shape (N, S, D)"""N, S, D = x.shape# Create a placeholder, to be overwritten by your code below.output = torch.empty((N, S, D))############################################################################# TODO: Index into your array of positional encodings, and add the         ## appropriate ones to the input sequence. Don't forget to apply dropout    ## afterward. This should only take a few lines of code.                    ############################################################################## *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****output = x + self.pe[:, :S]output = self.dropout(output)# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****#############################################################################                             END OF YOUR CODE                             #############################################################################return output

输出

在这里插入图片描述

transformer.forward

题面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解析

如果是正确理解了transformer模型的话,应该不会在这里卡壳,建议多看看相应的课程和论文讲解,我在代码中也写上了详尽的注释

代码

    def forward(self, features, captions):"""Given image features and caption tokens, return a distribution over thepossible tokens for each timestep. Note that since the entire sequenceof captions is provided all at once, we mask out future timesteps.Inputs:- features: image features, of shape (N, D)- captions: ground truth captions, of shape (N, T)Returns:- scores: score for each token at each timestep, of shape (N, T, V)"""N, T = captions.shape# Create a placeholder, to be overwritten by your code below.scores = torch.empty((N, T, self.vocab_size))############################################################################# TODO: Implement the forward function for CaptionTransformer.             ## A few hints:                                                             ##  1) You first have to embed your caption and add positional              ##     encoding. You then have to project the image features into the same  ##     dimensions.                                                          ##  2) You have to prepare a mask (tgt_mask) for masking out the future     ##     timesteps in captions. torch.tril() function might help in preparing ##     this mask.                                                           ##  3) Finally, apply the decoder features on the text & image embeddings   ##     along with the tgt_mask. Project the output to scores per token      ############################################################################## *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****# 第一步,嵌入说明和添加位置编码# captions: (N, T) -> (N, T, W)captions = self.embedding(captions)captions = self.positional_encoding(captions)# 第二步,将图像特征投影到相同的维度# features: (N, D) -> (N,W) -> (N, T, W)features_projected = self.visual_projection(features).unsqueeze(1)# 第三步,准备一个掩码(tgt_mask)来屏蔽说明中的未来时间步骤tgt_mask = torch.tril(torch.ones((T, T), dtype=torch.bool))# 第四部,将解码器特征应用于文本和图像嵌入以及tgt_mask# scores: (N, T, W) -> (N, T, V)scores = self.transformer(captions, features_projected, tgt_mask=tgt_mask)scores = self.output(scores)# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****#############################################################################                             END OF YOUR CODE                             #############################################################################return scores

输出

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在vue项目中用vue-watermark快捷开发屏幕水印效果

我们先引入一个第三方依赖 npm install vue-watermark然后 因为这只是个测试工具 我就直接代码写 App.vue里啦 参考代码如下 <template><div><vue-watermark :text"watermarkText"></vue-watermark><!-- 正常的页面内容 --></div…

OpenCV基础知识(8)— 图形检测

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状&#xff0c;然后对这些形状进行描绘&#xff0c;例如搜索并绘制图像的边缘&#xff0c;定位图像的位置&#xff0c;判断图像中有没有直线、…

QtCreator指定Windows Kits版本

先说下事件起因&#xff1a;之前一直在用Qt5.12.6&#xff0b;vs2017在写程序&#xff0c;后面调研了一个开源库Qaterial&#xff0c;但是翻来覆去的编译都有问题&#xff0c;后面升级到了Qt5.15.2&#xff0b;vs2019来进行cmake的编译&#xff0c;搞定了Qaterial&#xff0c;但…

Uniapp笔记(八)初识微信小程序

一、微信小程序基本介绍 1、什么是微信小程序 微信小程序简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用 小程序是一种新的开放能力&#…

键入网址到网页显示,期间发生了什么?

目录 1.DNS2.可靠传输 —— TCP3.远程定位 —— IP4.两点传输 —— MAC5.出口 —— 网卡6.送别者 —— 交换机&#xff08;可省略&#xff09;7.出境大门 —— 路由器8.数据包抵达服务器后9.响应过程&#xff1a;带有MAC、IP、TCP头部的完整HTTP报文&#xff1a; 1.DNS 客户端…

C++--两个数组的dp问题(2)

1.交错字符串 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定三个字符串 s1、s2、s3&#xff0c;请判断 s3 能不能由 s1 和 s2 交织&#xff08;交错&#xff09; 组成。 两个字符串 s 和 t 交织 的定义与过程如下&#xff0c;其中每个字符串都…

Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

一、Redis是什么 Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符串)、…

Vue中ElementUI结合transform使用时,发现弹框定位不准确问题

在近期开发中&#xff0c;需要将1920*1080放到更大像素大屏上演示&#xff0c;所以需要使用到transform来对页面进行缩放&#xff0c;但是此时发现弹框定位出错问题&#xff0c;无法准备定位到实际位置。 查看element-ui官方文档无果后&#xff0c;打算更换新的框架进行开发&am…

FFmpeg支持多线程编码并保存mp4文件示例

之前介绍的示例&#xff1a; (1).https://blog.csdn.net/fengbingchun/article/details/132129988 中对编码后数据保存成mp4 (2).https://blog.csdn.net/fengbingchun/article/details/132128885 中通过AVIOContext实现从内存读取数据 (3).https://blog.csdn.net/fengbingchun/…

自动设置服务器全教程

亲爱的爬虫探险家&#xff01;在网络爬虫的世界里&#xff0c;自动设置代理服务器是一个非常有用的技巧。今天&#xff0c;作为一家代理服务器供应商&#xff0c;我将为你呈上一份轻松实用的教程&#xff0c;帮助你轻松搞定爬虫自动设置代理服务器。 一、为什么需要自动设置代…

C语言实现状态机

关于状态机&#xff0c;基础的知识点可以自行理解&#xff0c;讲解的很多&#xff0c;这里主要是想写一个有限状态机FSM通用的写法&#xff0c;目的在于更好理解&#xff0c;移植&#xff0c;节省代码阅读与调试时间&#xff0c;体现出编程之美。 传统的实现方案 if...else : …

Unittest 笔记:unittest拓展生成HTM报告发送邮件

HTMLTestRunner 是一个unitest拓展可以生成HTML 报告 下载地址&#xff1a;GitHub: https://github.com/defnnig/HTMLTestRunner HTMLTestRunner是一个独立的py文件&#xff0c;可以放在Lib 作为第三方模块使用或者作为项目的一部分。 方式1&#xff1a; 验证是否安装成功&…

基于Android的课程教学互动系统 微信小程序uniapp

教学互动是学校针对学生必不可少的一个部分。在学校发展的整个过程中&#xff0c;教学互动担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类教学互动程序也在不断改进。本课题所设计的springboot基于Android的教学互动系统&#xff0c;使用SpringBoot框架&am…

Android TV开发之VerticalGridView

Android TV应用开发和手机应用开发是一样的&#xff0c;只是多了焦点控制&#xff0c;即选中变色。 androidx.leanback.widget.VerticalGridView 继承 BaseGridView &#xff0c; BaseGridView 继承 RecyclerView 。 所以 VerticalGridView 就是 RecyclerView &#xff0c;使…

mysql下载

网址 MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/ 2、选择MSI进行安装 3、这里我选择离线安装 4、这里我选择直接下载 5、等待下载安装即可

【无法联网】电脑wifi列表为空的解决方案

打开电脑, 发现wifi列表为空, 点击设置显示未连接 首先检查是不是网卡驱动有问题, cmd, devmgmt.msc 找到网络适配器, 看看网卡前面是否有感叹号, 如果没有则说明网卡没问题, 有问题则重装驱动 看看网络协议是否设置正确 找到"控制面板\所有控制面板项\网络和共享中心&…

通讯录(C语言)

通讯录 一、基本思路及功能介绍二、功能实现1.基础菜单的实现2.添加联系人信息功能实现3.显示联系人信息功能实现4.删除联系人信息功能实现5.查找联系人信息功能实现6.修改联系人信息功能实现7.排序联系人信息功能实现8.加载和保存联系人信息功能实现 三、源文件展示1.test.c2.…

MATLAB图论合集(三)Dijkstra算法计算最短路径

本贴介绍最短路径的计算&#xff0c;实现方式为迪杰斯特拉算法&#xff1b;对于弗洛伊德算法&#xff0c;区别在于计算了所有结点之间的最短路径&#xff0c;考虑到MATLAB计算的便捷性&#xff0c;计算时只需要反复使用迪杰斯特拉即可&#xff0c;暂不介绍弗洛伊德的实现&#…

ChatGPT 与前端技术实现制作大屏可视化

像这样的综合案例实分析,我们可以提供案例,维度与指标数据,让ChatGPT与AIGC 帮写出完整代码,并进行一个2行2列的布局设置。 数据与指令如下: 商品名称 销量 目标 完成率 可乐 479 600 79.83% 雪碧 324 600 54.00% 红茶 379 600 63.…

Unity报错DllNotFoundException:sqlite3

Unity项目中要使用轻型数据库sqlite&#xff0c;除了导入sqlite3.dll外&#xff0c;还需要导入Mono.Data.Sqlite.dll和System.Data.dll&#xff08;工程里或者编辑器里面有System.Data.dll时就不需要&#xff09;两个文件。 如果在编辑器中运行出现 “DllNotFoundException:sql…