Transformer-Encoder & Decoder细节详解(以DETR为例)

本文详细探讨Transformer的Encoder和Decoder,包括Add & Norm的目的、Positional Encoding的原理与进化、FFN的作用以及Decoder中的Object query机理。分析了为何在Transformer中不适用BN,并解释了Positional Encoding如何处理不同长度的序列,以及Feed Forward层增强表示能力的重要性。

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

由于讲解如何搭建Encoder和Decoder的文章有很多,因此本节将围绕为什么做分析而非怎么做。主要涉及到几个细节问题:Encoder中Add操作及目的、Norm操作及目的、不用Norm可不可以、为什么将BN不用于transformer任务、Feed Forward操作及目的、Positional Encoding的原理和进化、Decoder中Object query机理

Encoder分解之Add & Norm

  • Add操作
### RT-DETR Decoder 实现与解释 #### 解码器架构概述 解码器作为RT-DETR模型的关键组件之一,在实时目标检测任务中扮演着重要角色。该模块负责处理来自编码器的特征表示,并将其转换为目标框预测其他属性信息。具体来说,解码器通过多轮迭代查询机制来逐步优化对象位置估计精度[^1]。 #### 主要组成部分 1. **Transformer Decoder Layers** Transformer解码层由多个子层构成,每个子层内部包含了自注意力机制(self-attention),交叉注意力(cross-attention)以及前馈神经网络(FFN)[^1]。这些操作共同作用于输入序列上,从而增强了模型对于不同尺度物体的理解能力。 2. **Query Embeddings** 查询嵌入(query embeddings)用于初始化解码过程中所需的初始状态向量。它们通常是从预定义的一组可学习参数中选取而来,并在整个训练期间不断调整以适应特定数据集特性。 3. **Positional Encoding** 为了使模型能够感知到空间关系,会在输入张量之上叠加位置编码(positional encoding)。这有助于保持图像内各像素间的相对距离不变形,进而提高最终输出的质量。 4. **Prediction Heads** 预测头部(prediction heads)则专注于从经过变换后的隐藏表征里提取有用的信息并转化为具体的边界框坐标、类别标签等形式。此过程涉及到回归(regression)分类(classification)两种类型的计算逻辑。 #### PyTorch代码实现示 以下是基于PyTorch框架的一个简化版RT-DETR解码器实现: ```python import torch.nn as nn from transformers import DetrConfig, DetrModel class RTDetrDecoder(nn.Module): def __init__(self, config: DetrConfig): super().__init__() self.decoder_layers = nn.TransformerDecoder( decoder_layer=nn.TransformerDecoderLayer(d_model=config.hidden_size, nhead=config.num_heads), num_layers=config.dec_layers) self.query_embed = nn.Embedding(config.num_queries, config.hidden_size) self.pos_encoder = PositionEmbeddingSine(num_pos_feats=config.hidden_size // 2) # Prediction Head for bounding box regression and classification self.bbox_head = MLP(input_dim=config.hidden_size, hidden_dim=config.mlp_hidden_dim, output_dim=4, num_layers=3) self.class_head = nn.Linear(in_features=config.hidden_size, out_features=num_classes) def forward(self, memory, mask=None): bs = memory.shape[0] query_embeds = self.query_embed.weight.unsqueeze(1).repeat(1, bs, 1) pos_encodings = self.pos_encoder(memory) tgt = torch.zeros_like(query_embeds) hs = self.decoder_layers(tgt=tgt, memory=memory, memory_key_padding_mask=mask, pos=pos_encodings, query_pos=query_embeds) outputs_class = self.class_head(hs[-1]) outputs_coord = self.bbox_head(hs[-1]).sigmoid() return {'pred_logits': outputs_class, 'pred_boxes': outputs_coord} ``` 上述代码片段展示了如何构建一个基本版本的RT-DETR解码器类`RTDtrDecoder`及其主要方法`forward()`。其中涉及到了几个核心概念技术细节,如transformer解码层的设计思路、query embedding的作用方式等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刚哥吧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值