【论文笔记】Task-Aware Variational Adversarial Active Learning(CVPR2021)

论文:https://arxiv.org/pdf/2002.04709.pdf
代码:https://github.com/cubeyoung/TA-VAAL
本人最近在调研深度主动学习,视觉方向,欢迎交流。初次写blog,mark一下。

Abstract

深度主动学习的最近探索的是任务不可知的方法选择远离当前已标注样本集的数据点以及基于任务模型。不幸的是,前者没有利用任务相关的知识,而后者似乎没有得到很好的利用总体数据分布。在这里,我们提出了任务感知的Task-Aware Variational Adversarial Active Learning(TA-VAAL),是任务不可知性的初代VAAL的改进,考虑了标签和未标记池,把学习任务损失松弛化,转化为用Rank Conditional GAN预测对任务损失的排序。本文提出的TA-VAAL的表现优于各种基准数据集,在标签平衡或不平衡的图像分类任务以及语义分割优于多种sota的AL算法。总结来讲,本文主要的贡献在于将主动学习先前工作中任务模型输出引导型的《Learning Loss for Active Learning》(发表于CVPR2019,以下简称LL4AL)和数据引导型的《Variational Adversarial Active Learning》(发表于ICCV2019,以下简称VAAL)有效结合,提出了一种结合数据特征和任务学习效果驱动的一种可行的思路。

1. Introduction

主动学习基于池的选择策略,即是在所有未标注数据集中选择一批最有价值的送去专家标注,新增加到已标注集合中,然后再在所有已标注数据集上训练下游任务模型(分类、分割等等)。本文主要将近年来深度主动学习的方法分成了task-aware(任务可知)和task-agnostic(任务不可知)两种,两者的区别在于选择待标注样本时是否用到了任务的引导,如果使用了下游任务引导则时任务可知的,否则为任务不可知。本文的动机是采用一种综合两种方式的主动学习算法,可以同时利用任务不可知方法把握标注和未标注数据的分布差异,同时兼容任务可知方法能够结合学习任务的目标引导,来选择待标注样本。

2. Related Works

3. Method

本文延续了VAAL的基本框架,这里回顾一下VAAL的方法:全监督训练阶段的每个iteration,先用已标注数据在模型上训练,接着有标注和无标注的图像一起送进VAE,其中编码器映射到latent space中的向量作为判别器D的输入,VAE负责欺瞒判别器D将所有的数据都分类为已标签数据。训练D准确的将有无标注的数据鉴别开来,判别概率为1则为已标注,0为未标注,如此vae和D形成对抗训练。模型训练结束后,所有未标注数据送入vae,将D仍最倾向于认为是未标注(概率趋近于0)的k个样本送去标注,然后更新已标注和未标注数据集,再进入下一轮全监督训练。重复以上过程直到可选样本数为0。

本文还延续了LL4AL的预测任务模型损失的模块,只是将LL4AL中的损失预测器改成用Rank Conditional GAN实现的排序器rangker,ranker的输出作为VAAL里面对抗训练中D的额外的输入,也作为vae的decoder的额外输入。这里不再介绍LL4AL的工作,感兴趣的小伙伴请查看参考资料。
TA-VAAL算法框架

Ref

链接: [论文阅读] Learning Loss for Active Learning.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
几篇CVPR关于multi-task论文笔记整理,包括 一、 多任务课程学习Curriculum Learning of Multiple Tasks 1 --------------^CVPR2015/CVPR2016v--------------- 5 二、 词典对分类器驱动卷积神经网络进行对象检测Dictionary Pair Classifier Driven Convolutional Neural Networks for Object Detection 5 三、 用于同时检测和分割的多尺度贴片聚合(MPA)* Multi-scale Patch Aggregation (MPA) for Simultaneous Detection and Segmentation ∗ 7 四、 通过多任务网络级联实现感知语义分割Instance-aware Semantic Segmentation via Multi-task Network Cascades 10 五、 十字绣网络多任务学习Cross-stitch Networks for Multi-task Learning 15 --------------^CVPR2016/CVPR2017v--------------- 23 六、 多任务相关粒子滤波器用于鲁棒物体跟踪Multi-Task Correlation Particle Filter for Robust Object Tracking 23 七、 多任务网络中的全自适应特征共享与人物属性分类中的应用Fully-Adaptive Feature Sharing in Multi-Task Networks With Applications in Person Attribute Classification 28 八、 超越triplet loss:一个深层次的四重网络,用于人员重新识别Beyond triplet loss: a deep quadruplet network for person re-identification 33 九、 弱监督级联卷积网络Weakly Supervised Cascaded Convolutional Networks 38 十、 从单一图像深度联合雨水检测和去除Deep Joint Rain Detection and Removal from a Single Image 43 十一、 什么可以帮助行人检测?What Can Help Pedestrian Detection? (将额外的特征聚合到基于CNN的行人检测框架) 46 十二、 人员搜索的联合检测和识别特征学习Joint Detection and Identification Feature Learning for Person Search 50 十三、 UberNet:使用多种数据集和有限内存训练用于低,中,高级视觉的通用卷积神经网络UberNet: Training a Universal Convolutional Neural Network for Low-, Mid-, and High-Level Vision using Diverse Datasets and Limited Memory 62 一共13篇,希望能够帮助到大家
"Structure-Aware Transformer for Graph Representation Learning"是一篇使用Transformer模型进行图表示学习的论文。这篇论文提出了一种名为SAT(Structure-Aware Transformer)的模型,它利用了图中节点之间的结构信息,以及节点自身的特征信息。SAT模型在多个图数据集上都取得了非常好的结果。 以下是SAT模型的dgl实现代码,代码中使用了Cora数据集进行示例: ``` import dgl import numpy as np import torch import torch.nn as nn import torch.nn.functional as F class GraphAttentionLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(GraphAttentionLayer, self).__init__() self.num_heads = num_heads self.out_dim = out_dim self.W = nn.Linear(in_dim, out_dim*num_heads, bias=False) nn.init.xavier_uniform_(self.W.weight) self.a = nn.Parameter(torch.zeros(size=(2*out_dim, 1))) nn.init.xavier_uniform_(self.a.data) def forward(self, g, h): h = self.W(h).view(-1, self.num_heads, self.out_dim) # Compute attention scores with g.local_scope(): g.ndata['h'] = h g.apply_edges(fn.u_dot_v('h', 'h', 'e')) e = F.leaky_relu(g.edata.pop('e'), negative_slope=0.2) g.edata['a'] = torch.cat([e, e], dim=1) g.edata['a'] = torch.matmul(g.edata['a'], self.a).squeeze() g.edata['a'] = F.leaky_relu(g.edata['a'], negative_slope=0.2) g.apply_edges(fn.e_softmax('a', 'w')) # Compute output features g.ndata['h'] = h g.update_all(fn.u_mul_e('h', 'w', 'm'), fn.sum('m', 'h')) h = g.ndata['h'] return h.view(-1, self.num_heads*self.out_dim) class SATLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(SATLayer, self).__init__() self.attention = GraphAttentionLayer(in_dim, out_dim, num_heads) self.dropout = nn.Dropout(0.5) self.norm = nn.LayerNorm(out_dim*num_heads) def forward(self, g, h): h = self.attention(g, h) h = self.norm(h) h = F.relu(h) h = self.dropout(h) return h class SAT(nn.Module): def __init__(self, in_dim, hidden_dim, out_dim, num_heads): super(SAT, self).__init__() self.layer1 = SATLayer(in_dim, hidden_dim, num_heads) self.layer2 = SATLayer(hidden_dim*num_heads, out_dim, 1) def forward(self, g, h): h = self.layer1(g, h) h = self.layer2(g, h) return h.mean(0) # Load Cora dataset from dgl.data import citation_graph as citegrh data = citegrh.load_cora() g = data.graph features = torch.FloatTensor(data.features) labels = torch.LongTensor(data.labels) train_mask = torch.BoolTensor(data.train_mask) val_mask = torch.BoolTensor(data.val_mask) test_mask = torch.BoolTensor(data.test_mask) # Add self loop g = dgl.remove_self_loop(g) g = dgl.add_self_loop(g) # Define model and optimizer model = SAT(features.shape[1], 64, data.num_classes, 8) optimizer = torch.optim.Adam(model.parameters(), lr=0.005, weight_decay=5e-4) # Train model for epoch in range(200): model.train() logits = model(g, features) loss = F.cross_entropy(logits[train_mask], labels[train_mask]) optimizer.zero_grad() loss.backward() optimizer.step() acc = (logits[val_mask].argmax(1) == labels[val_mask]).float().mean() if epoch % 10 == 0: print('Epoch {:03d} | Loss {:.4f} | Accuracy {:.4f}'.format(epoch, loss.item(), acc.item())) # Test model model.eval() logits = model(g, features) acc = (logits[test_mask].argmax(1) == labels[test_mask]).float().mean() print('Test accuracy {:.4f}'.format(acc.item())) ``` 在这个示例中,我们首先加载了Cora数据集,并将其转换为一个DGL图。然后,我们定义了一个包含两个SAT层的模型,以及Adam优化器。在训练过程中,我们使用交叉熵损失函数和验证集上的准确率来监控模型的性能。在测试阶段,我们计算测试集上的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值