首页
/ External-Attention-pytorch中的ViP-MLP视觉置换器详解

External-Attention-pytorch中的ViP-MLP视觉置换器详解

2025-07-06 04:37:20作者:傅爽业Veleda

1. 模型概述

ViP-MLP(Vision Permutator MLP)是External-Attention-pytorch项目中实现的一种基于MLP(多层感知机)的视觉模型架构。该模型摒弃了传统的卷积操作和自注意力机制,完全依靠MLP和置换操作来处理图像数据,展现了纯MLP架构在计算机视觉任务中的潜力。

2. 核心组件解析

2.1 加权置换MLP(WeightedPermuteMLP)

WeightedPermuteMLP是整个模型的核心组件,它通过以下方式处理输入特征:

  1. 三维特征处理:同时处理通道(C)、高度(H)和宽度(W)三个维度的信息
  2. 分段维度处理:将通道维度划分为segment_dim个段,每段包含S=C/segment_dim个通道
  3. 三路MLP处理
    • 高度MLP:处理高度维度的信息
    • 宽度MLP:处理宽度维度的信息
    • 通道MLP:处理通道维度的信息
class WeightedPermuteMLP(nn.Module):
    def __init__(self, dim, segment_dim=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):
        super().__init__()
        self.segment_dim = segment_dim
        self.mlp_c = nn.Linear(dim, dim, bias=qkv_bias)
        self.mlp_h = nn.Linear(dim, dim, bias=qkv_bias)
        self.mlp_w = nn.Linear(dim, dim, bias=qkv_bias)
        self.reweight = Mlp(dim, dim // 4, dim *3)
        self.proj = nn.Linear(dim, dim)
        self.proj_drop = nn.Dropout(proj_drop)

2.2 置换器块(PermutatorBlock)

PermutatorBlock构成了模型的基本构建块,包含以下组件:

  1. 层归一化:使用LayerNorm对输入进行归一化
  2. 加权置换MLP:如上所述的WeightedPermuteMLP
  3. 残差连接:保留原始输入信息
  4. MLP扩展:增加模型容量
class PermutatorBlock(nn.Module):
    def __init__(self, dim, segment_dim, mlp_ratio=4., qkv_bias=False, qk_scale=None, drop=0., attn_drop=0.,
                 drop_path=0., act_layer=nn.GELU, norm_layer=nn.LayerNorm, skip_lam=1.0, mlp_fn = WeightedPermuteMLP):
        super().__init__()
        self.norm1 = norm_layer(dim)
        self.attn = mlp_fn(dim, segment_dim=segment_dim, qkv_bias=qkv_bias, qk_scale=None, attn_drop=attn_drop)
        self.drop_path = DropPath(drop_path) if drop_path > 0. else nn.Identity()
        self.norm2 = norm_layer(dim)
        mlp_hidden_dim = int(dim * mlp_ratio)
        self.mlp = Mlp(in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer)
        self.skip_lam = skip_lam

3. 模型架构

VisionPermutator类定义了完整的模型架构:

  1. Patch Embedding:将输入图像分割为不重叠的patch并嵌入到特征空间
  2. 多阶段处理:由多个PermutatorBlock组成的不同阶段
  3. 下采样:在阶段间进行特征图尺寸调整
  4. 分类头:最终的特征聚合和分类
class VisionPermutator(nn.Module):
    def __init__(self, layers, img_size=224, patch_size=4, in_chans=3, num_classes=1000,
        embed_dims=None, transitions=None, segment_dim=None, mlp_ratios=None, skip_lam=1.0,
        qkv_bias=False, qk_scale=None, drop_rate=0., attn_drop_rate=0., drop_path_rate=0.,
        norm_layer=nn.LayerNorm,mlp_fn = WeightedPermuteMLP):
        # 初始化代码...

4. 预定义模型配置

项目提供了几种预定义的模型配置:

  1. ViP-S:小型模型,有14x14和7x7两种patch size版本
  2. ViP-M:中型模型
  3. ViP-L:大型模型
@register_model
def vip_s14(pretrained=False, **kwargs):
    layers = [4, 3, 8, 3]
    transitions = [False, False, False, False]
    segment_dim = [16, 16, 16, 16]
    mlp_ratios = [3, 3, 3, 3]
    embed_dims = [384, 384, 384, 384]
    # 创建模型...

5. 技术特点

  1. 纯MLP架构:不依赖卷积或自注意力机制
  2. 置换操作:通过维度置换实现空间信息交互
  3. 自适应加权:自动学习不同维度特征的相对重要性
  4. 分段处理:将通道维度分组处理,提高效率
  5. 残差连接:稳定深层网络训练

6. 使用示例

# 创建输入张量
input = torch.randn(1, 3, 224, 224)

# 初始化模型
model = VisionPermutator(
    layers=[4, 3, 8, 3], 
    embed_dims=[384, 384, 384, 384], 
    patch_size=14, 
    transitions=[False, False, False, False],
    segment_dim=[16, 16, 16, 16], 
    mlp_ratios=[3, 3, 3, 3], 
    mlp_fn=WeightedPermuteMLP
)

# 前向传播
output = model(input)
print(output.shape)  # 输出形状应为(1, num_classes)

7. 总结

ViP-MLP模型展示了纯MLP架构在视觉任务中的潜力,通过创新的置换操作和加权机制,实现了对图像特征的有效处理。这种架构避免了传统卷积和自注意力的计算开销,同时保持了良好的性能表现,为视觉模型设计提供了新的思路。