Transformer发展历程 Decoder输出特征利用DCT解码投分割

一、Transformer

1. 起源

Transformer由NLP发家,用于NLP任务。

2. 动机

自适应地发掘长短关联。

3. 关联方式

自注意力/编码解码注意力。

4. 技巧

位置编码(Position Encoding)。
在这里插入图片描述

5. 自注意力机制

在这里插入图片描述
首先需要明白QKV分别是个啥。对于输入的每一个单词都生成三个vector,分别是query,key和value。这三个vector如何生成?将embedding层输出的向量分别输入三个神经网络,三个神经网络输出的向量就是query,key和value. 这三个神经网络是随着其它部分一起端到端训练的。因此自注意力倾向于一种affinity。
在这里插入图片描述
规定了输出,隐含地监督了网络的注意力部分让一个类别的部分去亲和为同样的输出。也就是每个pixel的Softmax(权重)*V尽量一致,Softmax(权重)来自QK,此时就进一步隐含让Q K使同类像素更亲和/一致。
在这里插入图片描述
但是,QKV是通过什么得到的呢?实际上,编码器Encoder提供KV,解码器Decoder提供K,如下图所示👇:

在这里插入图片描述

二、Vision Transformer(ViT)

1. 动机

上文我们说过,transformer起源于NLP,科学家们就开始思考,transformer这么好用,能不能用在CV领域呢?由于reansformer需要的输入是序列,因此,我们需要解决的是,将输入为图片转变成输入为序列。
在这里插入图片描述
如上图所示,将图片切分成若干块进行顺序编码,以序列的形式输入,每个小块flatten成1*n的形状,将输入转换为序列的形式。

2. 解决任务

分类/backbone

三、Swin Transformer

1. 解决任务

分类/backbone

2. 动机

图像分辨率高,像素点多,Transformer基于全局自注意力的计算导致计算量较大
在这里插入图片描述
整个模型采取层次化的设计,一共包含4个Stage,每个stage都会缩小输入特征图的分辨率,像CNN一样逐层扩大感受野。如下图所示👇:
在这里插入图片描述
核心:多次重叠局部交互可以实现全局信息处理

3. 方法

多次重叠局部交互可以实现全局信息处理,普通的transformer将每个向量与其他全部向量做相似度运算,当图片过大时计算量很大,这显然是不合适的。因此SWIN Transformer对此进行了改进,每次不是和全部的向量进行运算,而是和相邻m个进行运算,这样可以大大减少计算量而且逐渐可以获取到全局的感受野。

四、CSWIN Transformer

1. 解决任务

分类/backbone

2. 动机

计算量大,model capbility差

3. 解决方案

改变模型注意力区域的形状(有点像Axial-Attention)
在这里插入图片描述
在这里插入图片描述

五、DETR

1. 解决任务

目标检测

2. 动机

传统的CNN目标检测使用anchor的方式,抛出预测结果。主要依赖于NMS(非极大值抑制)后处理得到最终检测结果。NMS非常耗时

3. 解决方案

动态输出集与真值集进行 二分图最小权匹配
在这里插入图片描述

六、Deformable DETR

1. 解决任务

目标检测

2. 动机

DETR训练慢,因为Self-Attention无法有效捕获空间信息

3. 方法

使用逐层优化过程,利用可变形卷积代替子注意力机制
在这里插入图片描述

七、UP-DETR

1. 解决任务

目标检测

2. 动机

DETR训练速度较慢(Decoder的问题)

3. 解决方案

自监督、预训练
在这里插入图片描述

八、MaskFormer

1. 解决任务

语义分割

2. 动机

transformer卷积输出可作为动态核、加解码head用于分割

3. 解决方案

Decoder输出特征embedding后与特征图进行卷积
在这里插入图片描述

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TransformerDecoder解码器是Transformer模型中的一个重要组件,用于生成目标序列。它由多个Transformer Block组成,每个Block包含自注意力机制和前馈神经网络。Decoder的输入是编码器的输出和目标序列的嵌入表示。 下面是一个示例代码,演示了如何使用TransformerDecoder解码器生成目标序列[^1]: ```python import torch import torch.nn as nn class TransformerDecoder(nn.Module): def __init__(self, num_layers, embed_size, num_heads, feed_forward_dim, dropout_rate): super(TransformerDecoder, self).__init__() self.num_layers = num_layers self.decoder_layers = nn.ModuleList([ TransformerDecoderLayer(embed_size, num_heads, feed_forward_dim, dropout_rate) for _ in range(num_layers) ]) def forward(self, enc_output, target_seq): output = target_seq for layer in self.decoder_layers: output = layer(output, enc_output) return output class TransformerDecoderLayer(nn.Module): def __init__(self, embed_size, num_heads, feed_forward_dim, dropout_rate): super(TransformerDecoderLayer, self).__init__() self.self_attention = nn.MultiheadAttention(embed_size, num_heads, dropout=dropout_rate) self.encoder_attention = nn.MultiheadAttention(embed_size, num_heads, dropout=dropout_rate) self.feed_forward = nn.Sequential( nn.Linear(embed_size, feed_forward_dim), nn.ReLU(), nn.Linear(feed_forward_dim, embed_size) ) self.layer_norm1 = nn.LayerNorm(embed_size) self.layer_norm2 = nn.LayerNorm(embed_size) self.layer_norm3 = nn.LayerNorm(embed_size) self.dropout = nn.Dropout(dropout_rate) def forward(self, target_seq, enc_output): # Self-attention self_attention_output, _ = self.self_attention(target_seq, target_seq, target_seq) self_attention_output = self.dropout(self_attention_output) self_attention_output = self.layer_norm1(target_seq + self_attention_output) # Encoder attention encoder_attention_output, _ = self.encoder_attention(self_attention_output, enc_output, enc_output) encoder_attention_output = self.dropout(encoder_attention_output) encoder_attention_output = self.layer_norm2(self_attention_output + encoder_attention_output) # Feed forward feed_forward_output = self.feed_forward(encoder_attention_output) feed_forward_output = self.dropout(feed_forward_output) output = self.layer_norm3(encoder_attention_output + feed_forward_output) return output # 使用示例 num_layers = 6 embed_size = 512 num_heads = 8 feed_forward_dim = 2048 dropout_rate = 0.1 decoder = TransformerDecoder(num_layers, embed_size, num_heads, feed_forward_dim, dropout_rate) enc_output = torch.randn(batch_size, max_token_count, embed_size) target_seq = torch.randn(batch_size, target_seq_length, embed_size) output = decoder(enc_output, target_seq) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天使Di María

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值