论文阅读 | Event Transformer. A sparse-aware solution for efficient event data processing

文章介绍了EventTransformer(EvT)方法,该方法针对事件相机的数据处理,通过将voxel图片分块并仅处理含足够事件的区域,以及使用基于注意力机制的紧凑Transformer骨干网络,有效利用事件的稀疏特性,同时在性能上取得最佳效果。实验涉及分类任务,展示了模型在长距离和短距离分类上的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言: CVPR 2022 workshop 用transformer提取事件特征

Event Transformer. A sparse-aware solution for efficient event data processing

引言

从事件相机中提取信息目前已有的比较好的方法可以分为:效果最好的方法是frame-based,用卷积神经网络或循环神经网络,其次是利用图卷积、点卷积、脉冲神经网络等方法来更好的利用事件的稀疏性质

我们的方法Event Transformer (EvT)解决了事件的稀疏特性,同时还取得了最好的效果
我们的创新点在于
第一:通过将voxel图片打成patch,只计算有着足够数量点的patch
第二:提出一种 a compact transformer-like backbone based on attention mechanisms,其中latent memory vectors只需要最小的计算资源

方法

EvT的处理流程如下,最后的任务是做分类
在这里插入图片描述
首先将事件转换成在这里插入图片描述
的voxel图片,B代表timebins个数,2代表2极性,voxel中存的是落到一个单位cell的事件数量,然后对voxel作取对数处理,来平衡掉某些cell的数量极端(大)的情况

在这里插入图片描述
然后这样的一个voxel F’在空间上被分成不同的patch,patch的空间尺寸是P * P,当一个patch中的点的数量大于百分之m,则被视为激活patch,最后没有被激活的patch就被丢弃,然后设置一个阈值n,如果patch中的点仍然小于这个阈值,则加宽时间窗e time-window,使得处理更多的点,然后重新计算激活patch
最后,一个patch的尺寸 (P,P, B,2)将特征展平为(P ×P × B × 2)=input_dim,则看成 T ×dim 的向量 ,

网络的backbone如下
输入的尺寸是 (T,dim) ,latent memory vectors尺寸是(M,dim)
在这里插入图片描述
首先将输入进行特征映射到高维(T,dim)变成(T,D),FF1 则只有一个初始的FF,concat position embedding 和一个FF,FF2则是有两层feed forward,加上一个跳跃连接

主干网络
主干网络是由一个cross-Attention 和N个 Self-Attention构成,先进行cross-transformer,然后进行self-transformer
即T × D 与M ×D 做attention,得到新的向量 M ×D,新的向量M×D自己与自己作attention(N次),得到新的M ×D作输出同时更新memory
更新memory:直接相加
(当然这里图中和文中都没有提到的是,它是一个循环网络,即在每个不同的时间窗口进行图示的第二部分backbone processing,因此memory可以记录之前时刻的信息)
吐槽一下发布的代码,所说训练测试代码都有,但超参数文件没给啊!!连网络结构都写到超参数文件里去了啊啊啊可恶!!看了一个下午研究某个输入变量到底指的啥,发现还不如手敲来得快…

实验

由于是作分类,这里直接将最终的latent vector 过两层MLP然后average pooling
实验超参数设置:
patch尺寸:6 × 6
百分比阈值m : 7.5(做了log之后)
最小点阈值n : 16
时间窗:特定数据集不同
timebins:特定数据集不同
特征维D:128
latent vector长度M:96
初始化latent vector:均值0方差0.2的正态分布
位置编码:16维傅里叶
注意力头:position token1或 2,其他是4

训练参数:

结果
长距离分类
在这里插入图片描述
在这里插入图片描述
短距离分类
在这里插入图片描述
效率比较
在这里插入图片描述

总结

结合了循环神经网络的transformer,应该在NLP中比较常见,但没怎么在视觉任务中见到过

"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优化器。在训练过程中,我们使用交叉熵损失函数和验证集上的准确率来监控模型的性能。在测试阶段,我们计算测试集上的准确率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值