Vision Transformer(iGPT,ViT,DERT,IPT,TransReID,TransGAN,TNT,CvT)

Transformer太过强大,目前有很多模型都将其引入自己的领域做调整,除了它最先发迹的NLP外,也初步的从NLP到达CV的战场。本篇只整理几篇在纯CV届的Transformer应用。博主曾经整理过Cross-modal的Transformer也可以参考,传送门:Cross-modal Pretraining in BERT(跨模态预训练)

首先先看看既然Transformer能在NLP中淘汰RNN,那么作为另一个神经网络基石级的CNN,是否也可以直接被替代呢?

在这里插入图片描述
Generative Pretraining from Pixels(iGPT)
来自ICML20,尝试不使用CNN直接做image分类。作者提到,由于BERT 和 GPT-2 等 Transformer 模型是域不可知的,这意味着它们可以直接应用于任何形式的 1D 序列。所以作者直接把2D的图像处理成1D的序列,然后输入到Transformer,然后做next pixel prediction任务。

完整的架构如上图,最左边的图1是把图像由2D展平为1D,这里直接处理原像素。图2是作者使用的2种预训练目标:auto-regressive next pixel prediction 和masked pixel prediction,一个像AE一样直接预测所有像素,另一个类似BERT预测masked像素。

attn_mask = torch.full(
        (len(x), len(x)), -float("Inf"), device=x.device, dtype=x.dtype
)
attn_mask = torch.triu(attn_mask, diagonal=1)#[784, 784]
#attn_mask = [[0,-inf,-inf...,-inf],
#            [0,0,-inf,...,-inf],
#            [0,0,0,...,-inf],
#            [0,0,0,...,0]]

最后fine-turning。如图3有两种方式:

  • (i) fine-tune:增加了一个小的分类头,用于优化分类目标并adapt所有权重。
  • (ii)Linear-probe:将pretraining的模型视作特征提取器,增加一个分类头,只训练这个分类头。第二种方式的直觉在于“一个好的特征应该能够区分不同的类”。

fine-tune效果好有可能是因为架构很适合下游任务,但是linear-probe只取决于特征质量。

# x:原始图像处理后得到的序列 [32*32, 64],64为batchsize,32是下采样后的长款
length, batch = x.shape
# 将每个pixel作为token求embedding,128为embedding的维度
h = self.token_embeddings(x) # [32*32, 64, 128]
# 添加位置编码
h = h + self.position_embeddings(positions).expand_as(h)
# transformer
for layer in self.layers:
    h = layer(h)
# 自回归编码需要输出logits,映射回字典长度
logits = self.head(h) # [32*32,64,16]
# 16类的cross_entropy,对每个pixel计算损失
loss = self.criterion(logits.view(-1, logits.size(-1)), x.view(-1))

paper:http://proceedings.mlr.press/v119/chen20s.html

在这里插入图片描述
An image is worth 16x16 words: Transformers for image recognition at scale(ViT)
来自ICLR2021,这篇文章在上一篇文章的基础上更加的深入。同样的motivation也是直接用Transformer来代替CNN。作者认为虽然Transformer相比CNN缺少一些归纳偏差,例如平移等变和局部性,但在数据集足够的情况下,泛化能力同样也是可以达到很强的。

ViT的具体架构如上图,直接将图像分割成小块,其中图像块的position处理方式与标记(单词)相同,然后输入到Transformer中,最后以监督的方式训练模型进行图像分类。此时因为不会使用CNN抽特征,那么输入存在一个问题:图像是2D,不用CNN的话不就没有特征做输入吗?

针对这一点,需要重塑图片为扁平的序列块,采用可训练的线性映射将patch进行平化,映射到D维上,即原先正常图片的H x W x C直接变成Nx(P^2 x C)。 z 0 = [ x c l a s s ; x p 1 E ; x p 2 E ; . . . ; x p N E ] + E p o s , E ∈ R ( P 2 ⋅ C ) × D , E p o s ∈ R ( N + 1 ) × D z_0=[x_{class};x_p^1E;x_p^2E;...;x_p^NE]+E_{pos},E \in R^{(P^2 \cdot C)\times D},E_{pos} \in R^{(N+1)\times D} z0=[xclass;xp1E;xp2E;...;xpNE]+Epos,ER(P2C)×D,Epos<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值