【数据分析】之ReGat的VQAFeaturesDataset加载

2024-01-16 01:58

本文主要是介绍【数据分析】之ReGat的VQAFeaturesDataset加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 .VQAFeatureDataset

此类是ReGat项目对torch自带的from torch.utils.data import Dataset的重写,是模型运行的时候训练集和测试集的加载,加载的数据是模型forward函数的参数。如下:
regat.forward():

    def forward(self, v, b, q, implicit_pos_emb, sem_adj_matrix,spa_adj_matrix, labels):"""Forwardv: [batch, num_objs, obj_dim]b: [batch, num_objs, b_dim]q: [batch_size, seq_length]pos: [batch_size, num_objs, nongt_dim, emb_dim]sem_adj_matrix: [batch_size, num_objs, num_objs, num_edge_labels]spa_adj_matrix: [batch_size, num_objs, num_objs, num_edge_labels]return: logits, not probs"""w_emb = self.w_emb(q) #问题嵌入q_emb_seq = self.q_emb.forward_all(w_emb)  # [batch, q_len, q_dim]q_emb_self_att = self.q_att(q_emb_seq)  #添加自注意力信息# [batch_size, num_rois, out_dim]if self.relation_type == "semantic": #如果关系类型是语义v_emb = self.v_relation.forward(v, sem_adj_matrix, q_emb_self_att)elif self.relation_type == "spatial": #如果关系类型是空间v_emb = self.v_relation.forward(v, spa_adj_matrix, q_emb_self_att)else:  # implicit #如果是隐式关系v_emb = self.v_relation.forward(v, implicit_pos_emb,q_emb_self_att)if self.fusion == "ban": #融合模型1joint_emb, att = self.joint_embedding(v_emb, q_emb_seq, b)elif self.fusion == "butd": #融合模型2q_emb = self.q_emb(w_emb)  # [batch, q_dim]joint_emb, att = self.joint_embedding(v_emb, q_emb)else:  # mutan融合模型3joint_emb, att = self.joint_embedding(v_emb, q_emb_self_att)if self.classifier: #分类模型logits = self.classifier(joint_emb)else: logits = joint_embreturn logits, att

VQAFeatureDataset

self中的变量

变量名含义来源
self.ans2label单词-索引表示:字典trainval_ans2label.pkl{‘net’: 0, ‘pitcher’: 1, ‘orange’: 2, ‘yes’: 3, ‘white’: 4,…
self.label2ans索引-单词表示:列表trainval_label2ans.pkl[‘net’, ‘pitcher’, ‘orange’, ‘yes’, ‘white’,.
self.num_ans_candidates答案单词候选数:intlen(self.ans2label)3129
self.img_id2idx图像id-索引表示:字典imgid2idx.pkl{218224: 0, 306670: 1, 208663: 2, 225177: 3, 467257: 4, .
self.features图像特征:Tensorhf.get(‘image_features’)tensor[40504,36,2048]
self.normalized_bb标准化区域边界框空间位置:Tensorhf.get(‘spatial_features’)tensor([40504, 36, 4])
self.bb区域边界框位置:Tensorhf.get(‘image_bb’)tensor[40504,36,4]
self.semantic_adj_matrix语义形容词矩阵如果在hf的键中:hf.get(‘semantic_adj_matrix’) ,不在=None
self.spatial_adj_matrix空间形容词矩阵如果在hf的键中:hf.get(‘image_adj_matrix’) ,不在=None
self.pos_boxesNoneNoneNone
self.entries数据条目,items:list_load_dataset(dataroot, name, self.img_id2idx,self.label2ans)长度214354
self.nongt_dimself.nongt_dim = nongt_dim36
self.emb_dim位置嵌入维度pos_emb_dim64
self.v_dim图像特征嵌入维度self.features.size(1 if self.adaptive else 2)2048
self.s_dim方向维度self.normalized_bb.size(1 if self.adaptive else 2)6
class VQAFeatureDataset(Dataset):def __init__(self, name, dictionary, relation_type, dataroot='data',adaptive=False, pos_emb_dim=64, nongt_dim=36):super(VQAFeatureDataset, self).__init__()assert name in ['train', 'val', 'test-dev2015', 'test2015']# 加载annotations.json的预处理后的pkl文件ans2label_path = os.path.join(dataroot, 'cache', 'trainval_ans2label.pkl')label2ans_path = os.path.join(dataroot, 'cache', 'trainval_label2ans.pkl')self.ans2label = pickle.load(open(ans2label_path, 'rb')) #形如{'w1':1,'w2':2,...,'w3129':3129}self.label2ans = pickle.load(open(label2ans_path, 'rb'))#['w1','w2',...,'w3129']self.num_ans_candidates = len(self.ans2label) #候选答案单词数目=3129self.dictionary = dictionary #词典,包含19901个单词,键:idx2word#['w1','w2',...,'w19901'],word2idx{'w1':1,'w2':2,...,'w19901':19901},padding_idx=19901,ntoken=19901self.relation_type = relation_typeself.adaptive = adaptive #数据集是否是自适应的10-100个区域的prefix = '36'if 'test' in name:prefix = '_36'#加载hdf5文件目录h5_dataroot = dataroot+"/Bottom-up-features-adaptive"\if self.adaptive else dataroot+"/Bottom-up-features-fixed"imgid_dataroot = dataroot+"/imgids" #加载图像ids文件:#加载imgid2idx.pkl文件,保存再self.img_id2idx里:{id1:1,id2:2,...,id40504:40504}self.img_id2idx = pickle.load(open(os.path.join(imgid_dataroot, '%s%s_imgid2idx.pkl' %(name, '' if self.adaptive else prefix)), 'rb'))#加载hdf5文件h5_path = os.path.join(h5_dataroot, '%s%s.hdf5' %(name, '' if self.adaptive else prefix))print('loading features from h5 file %s' % h5_path)with h5py.File(h5_path, 'r') as hf:# self.features = np.array(hf.get('image_features'))self.features = np.array(hf.get('image_features'),dtype='float32')self.normalized_bb = np.array(hf.get('spatial_features'),dtype='float32')self.bb = np.array(hf.get('image_bb'),dtype='float32')print("hdf5数据加载成功!")if "semantic_adj_matrix" in hf.keys() \and self.relation_type == "semantic":self.semantic_adj_matrix = np.array(hf.get('semantic_adj_matrix'))print("Loaded semantic adj matrix from file...",self.semantic_adj_matrix.shape)else:self.semantic_adj_matrix = Noneprint("Setting semantic adj matrix to None...")if "image_adj_matrix" in hf.keys()\and self.relation_type == "spatial":self.spatial_adj_matrix = np.array(hf.get('image_adj_matrix'))#从文件加载空间的形容词矩阵print("Loaded spatial adj matrix from file...",self.spatial_adj_matrix.shape)else:self.spatial_adj_matrix = Noneprint("Setting spatial adj matrix to None...")self.pos_boxes = Noneif self.adaptive:self.pos_boxes = np.array(hf.get('pos_boxes'),dtype='float32')self.entries = _load_dataset(dataroot, name, self.img_id2idx,self.label2ans)self.tokenize()print("数据加载成功!")self.tensorize()self.nongt_dim = nongt_dimself.emb_dim = pos_emb_dimself.v_dim = self.features.size(1 if self.adaptive else 2)self.s_dim = self.normalized_bb.size(1 if self.adaptive else 2)def tokenize(self, max_length=14):"""Tokenizes the questions.This will add q_token in each entry of the dataset.-1 represent nil, and should be treated as padding_idx in embedding"""for entry in self.entries:tokens = self.dictionary.tokenize(entry['question'], False)tokens = tokens[:max_length]if len(tokens) < max_length:# Note here we pad to the back of the sentencepadding = [self.dictionary.padding_idx] * \(max_length - len(tokens))tokens = tokens + paddingutils.assert_eq(len(tokens), max_length)entry['q_token'] = tokensdef tensorize(self):self.features = torch.from_numpy(self.features)self.normalized_bb = torch.from_numpy(self.normalized_bb)self.bb = torch.from_numpy(self.bb)if self.semantic_adj_matrix is not None:self.semantic_adj_matrix = torch.from_numpy(self.semantic_adj_matrix).double()if self.spatial_adj_matrix is not None:self.spatial_adj_matrix = torch.from_numpy(self.spatial_adj_matrix).double()if self.pos_boxes is not None:self.pos_boxes = torch.from_numpy(self.pos_boxes)for entry in self.entries:question = torch.from_numpy(np.array(entry['q_token']))entry['q_token'] = questionanswer = entry['answer']if answer is not None:labels = np.array(answer['labels'])scores = np.array(answer['scores'], dtype=np.float32)if len(labels):labels = torch.from_numpy(labels)scores = torch.from_numpy(scores)entry['answer']['labels'] = labelsentry['answer']['scores'] = scoreselse:entry['answer']['labels'] = Noneentry['answer']['scores'] = Nonedef __getitem__(self, index):entry = self.entries[index]raw_question = entry["question"]image_id = entry["image_id"]question = entry['q_token']question_id = entry['question_id']if self.spatial_adj_matrix is not None:spatial_adj_matrix = self.spatial_adj_matrix[entry["image"]]else:spatial_adj_matrix = torch.zeros(1).double()if self.semantic_adj_matrix is not None:semantic_adj_matrix = self.semantic_adj_matrix[entry["image"]]else:semantic_adj_matrix = torch.zeros(1).double()if not self.adaptive:# fixed number of bounding boxesfeatures = self.features[entry['image']]normalized_bb = self.normalized_bb[entry['image']]bb = self.bb[entry["image"]]else:features = self.features[self.pos_boxes[entry['image']][0]:self.pos_boxes[entry['image']][1], :]normalized_bb = self.normalized_bb[self.pos_boxes[entry['image']][0]:self.pos_boxes[entry['image']][1], :]bb = self.bb[self.pos_boxes[entry['image']][0]:self.pos_boxes[entry['image']][1], :]answer = entry['answer']if answer is not None:labels = answer['labels']scores = answer['scores']target = torch.zeros(self.num_ans_candidates)if labels is not None:target.scatter_(0, labels, scores)return features, normalized_bb, question, target,\question_id, image_id, bb, spatial_adj_matrix,\semantic_adj_matrixelse:return features, normalized_bb, question, question_id,\question_id, image_id, bb, spatial_adj_matrix,\semantic_adj_matrixdef __len__(self):return len(self.entries)

entries
entries是数据的条目,类型是list,共214354条数据,每条数据是一个字典。
每条数据如下:

键值含义
question_id问题id42000
image_id图像id42
image图像37244
question问题文字表示‘What color are the gym shoes?’
answer答案:label,score{‘labels’: tensor([ 4, 1594], dtype=torch.int32), ‘scores’: tensor([1.0000, 0.3000])}
q_token问题索引向量表示tensor([ 0, 10, 68, 11, 2618, 225, 19901, 19901, 19901, 19901,19901, 19901, 19901, 19901], dtype=torch.int32)

2. 模型需要传入的getitem数据返回 :如果是固定36个区域

变量名来源
featuresself.features[entry[‘image’]],此处的image是位置
normalized_bbself.normalized_bb[entry[‘image’]]
questionentry[‘q_token’]
targetscatter_(0, labels, scores)
question_identry[‘question_id’]
image_identry[“image_id”]
bbself.bb[entry[“image”]]
spatial_adj_matrixself.spatial_adj_matrix[entry[“image”]]
semantic_adj_matrixself.semantic_adj_matrix[entry[“image”]]

这篇关于【数据分析】之ReGat的VQAFeaturesDataset加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/610958

相关文章

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

gazebo 已加载模型但无法显示

目录 写在前面的话问题一:robot_state_publisher 发布机器人信息失败报错一 Error: Error document empty.报错二 .xcaro 文件中有多行注释成功启动 问题二:通过 ros2 启动 gazebo 失败成功启动 问题三:gazebo 崩溃和无法显示模型问题四: 缺少 robot_description 等话题正确的输出 写在前面的话

win7下安装Canopy(EPD) 及 Pandas进行python数据分析

先安装好canopy,具体安装版本看自己需要那种,我本来是打算安装win764位的,却发现下载总是出现错误,无奈只能下载了32位的! https://store.enthought.com/downloads/#default 安装好之后,参考如下连接,进行检验: 之后再根据下面提供的连接进行操作,一般是没问题的! http://jingyan.baidu.com/article/5d6

JVM类的加载器及加载过程

类的加载器及加载过程 文章目录 类的加载器及加载过程类的加载过程加载:链接(验证、准备、解析):初始化: 类加载器的分类引导类加载器:BootstrapClassLoader 启动类加载器( C/C++实现,嵌套在JVM内部)自定义类加载器(所有派生于抽象类ClassLoader的类加载器)获取ClassLoader的途径 双亲委派机制(重点)判断两个Class对象是否为同一个类

Unity Adressables 使用说明(六)加载(Load) Addressable Assets

【概述】Load Addressable Assets Addressables类提供了加载 Addressable assets 的方法。你可以一次加载一个资源或批量加载资源。为了识别要加载的资源,你需要向加载方法传递一个键或键列表。键可以是以下对象之一: Address:包含你分配给资源的地址的字符串。Label:包含分配给一个或多个资源的标签的字符串。AssetReference Obj

「大数据分析」图形可视化,如何选择大数据可视化图形?

​图形可视化技术,在大数据分析中,是一个非常重要的关键部分。我们前期通过数据获取,数据处理,数据分析,得出结果,这些过程都是比较抽象的。如果是非数据分析专业人员,很难清楚我们这些工作,到底做了些什么事情。即使是专业人员,在不清楚项目,不了解业务规则,不熟悉技术细节的情况下。要搞清楚我们的大数据分析,这一系列过程,也是比较困难的。 我们在数据处理和分析完成后,一般来说,都需要形成结论报告。怎样让大

Eclipse发布Maven项目到tomcat,无法加载到lib文件夹下的jar包

BMS 解决方法: 当我们发布web项目到tomcat时,访问地址时会报一个classnotfound的错误,但是eclipse中的项目中都已经添加了相应的类,有一种比较容易犯的错误是,你没有把额外所需的jar包加到tomcat中的lib文件夹中,在这里介绍一种在项目中直接添加jar包到lib目录下:  右键已创建的web项目——properties属性——点击Deployment Assem

jupyter在加载pkl文件时报错ModuleNotFoundError: No module named 'pandas.core.internals.managers'; '的解决方法

笔者当看到这个错误的时候一脸懵逼,在pycharm上正常运行的code 放在jupyter就不成了,于是就研究一翻。 一开始以为自己的pkl文件有问题,研究重点放在这里,最后发现不是。 然后取搜索pycharm和jupyter下的python的\Lib\site-packages\pandas\core\internals有什么不同 发现jupyter下没有pandas\core\intern