transformer论文解读_Transformer席卷CV

Vision Transformer

144fac910e64051eab8e75d2076f7382.png

简单回顾

Transformernlp领域的常见模型了,在Attention is All You Need一文中凭借着嚣张的题目和明显的效果席卷了nlp的各个领域。最近CV领域也出现了一些使用Transformer的论文,比如目标检测的DETR,以及今天介绍的Vision Transformer

fdda9678d825010066074cd829ea15b1.png

经典的Transformer分为Encoder和Decoder两个模块,其中最主要的部分就是Multi-Head Attention。Self Attention的操作相信很多人已经有所了解,我这里简单回顾一下。

fd198cd33a669f6587d6873b3d28fb80.png
2600f88809783f0904127ec1571a3b86.png
9968353a82674b4fc955c03d6e2ce19e.png
Self Attetion

而这里的Decoder部分会多一个mask,主要作用就是在解码过程中避免模型看到未来信息了,因为是一并输进去的,比如输入8个词,想要解码出10个词,那么这10个词就要在解码第一个单词时mask掉后面9个单词。具体做法就是生成一个上三角矩阵。

如果想复习一遍Attention的可以看看李宏毅老师讲解的Transformer,slide

ViT

Vision Transformer的代码已经在github上公开了,实现非常简单,点击阅读原文或者此处链接repo.

调用起来非常简单:

import torch
from vit_pytorch.efficient import ViT
from linformer import Linformer

efficient_transformer = Linformer(
    dim = 512,
    seq_len = 4096 + 1,  
    # 64 x 64 patches + 1 cls token
    depth = 12,
    heads = 8,
    k = 256
)

v = ViT(
    dim = 512,
    image_size = 2048,
    patch_size = 32,
    num_classes = 1000,
    transformer = efficient_transformer
)

img = torch.randn(1, 3, 2048, 2048) 
# your high resolution picture
v(img) 
# (1, 1000)

我这里从源码层面来解读一下这篇论文。

分块(patch)

这篇论文主要做的是分类任务,主要思想是使用Transformer Encoder部分去做分类,跟nlp的一样,会在图片序列中加入分类的token,图片的序列则是由一张图片切成多个patch得到。shape的变化是,其中.

在代码中是一句话的事情,用了einops这个库。

x = einops.rearrange(img, 'b c (h p1) (w p2) -> b (h w) (p1 p2 c)', p1 = p, p2 = p)

位置编码(positional encoding)

这里的位置编码并没有使用传统的Transformer的cos sin的那套编码方式。

而是采用随机初始化,之后再训练学习出来的

self.pos_embedding = nn.Parameter(torch.randn(1, num_patches + 1, dim))
x += self.pos_embedding[:, :(n + 1)]

分类(cls token)

假如用第一个patch的embdding作为分类的特征这也是不公平的,所以另外concat了一个分类的token

self.cls_token = nn.Parameter(torch.randn(1, 1, dim))
cls_tokens = repeat(self.cls_token, '() n d -> b n d', b = b)
x = torch.cat((cls_tokens, x), dim=1)

总结

可以看到这里在视觉上用transformer的效果也不差,或许以后能够看到更多地在CV领域中使用Transformer的论文。但是经过笔者的测试,确实整个模型都会比用CNN要大,而且这么多的全连接也使得模型很容易过拟合,在CV领域可能还差一些更具有划时代里程碑式的像CNN一样即插即用的Attention模块。(虽然很多模型都被Attention洗过一遍了。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值