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是整个模型的核心组件,它通过以下方式处理输入特征:
- 三维特征处理:同时处理通道(C)、高度(H)和宽度(W)三个维度的信息
- 分段维度处理:将通道维度划分为segment_dim个段,每段包含S=C/segment_dim个通道
- 三路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构成了模型的基本构建块,包含以下组件:
- 层归一化:使用LayerNorm对输入进行归一化
- 加权置换MLP:如上所述的WeightedPermuteMLP
- 残差连接:保留原始输入信息
- 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类定义了完整的模型架构:
- Patch Embedding:将输入图像分割为不重叠的patch并嵌入到特征空间
- 多阶段处理:由多个PermutatorBlock组成的不同阶段
- 下采样:在阶段间进行特征图尺寸调整
- 分类头:最终的特征聚合和分类
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. 预定义模型配置
项目提供了几种预定义的模型配置:
- ViP-S:小型模型,有14x14和7x7两种patch size版本
- ViP-M:中型模型
- 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. 技术特点
- 纯MLP架构:不依赖卷积或自注意力机制
- 置换操作:通过维度置换实现空间信息交互
- 自适应加权:自动学习不同维度特征的相对重要性
- 分段处理:将通道维度分组处理,提高效率
- 残差连接:稳定深层网络训练
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架构在视觉任务中的潜力,通过创新的置换操作和加权机制,实现了对图像特征的有效处理。这种架构避免了传统卷积和自注意力的计算开销,同时保持了良好的性能表现,为视觉模型设计提供了新的思路。