7种视觉MLP整理(上)

如果视觉Transformer中去掉MSA部分,性能是否能达到相同的水平?或者说仅使用MLP来实现视觉任务是否可行?由此考虑到视觉MLP。

一、EANet(External Attention)

原文链接:https://arxiv.org/pdf/2105.02358.pdf

\begin{aligned} A&=\textup{Norm}(FM_k^T)\\ F_{out}&=AM_v \end{aligned}

其中M_kM_v为可学习的参数,不依赖于输入。Norm为double normalization(分别对行和列):

(\tilde{\alpha})_{i,j}=FM^T_k,\hat{\alpha}_{i,j}=\frac{\exp(\tilde{\alpha}_{i,j})}{\sum_k \exp(\tilde{\alpha}_{k,j})},\alpha_{i,j}=\frac{\hat{\alpha}_{i,j}}{\sum_k \hat{\alpha}_{i,k}}

二、MLP-Mixer

原文链接:https://arxiv.org/pdf/2105.01601.pdf

Mixer Layer

其中MLP为双层,层间有GELU激活函数。

网络结构

        将图像分成不重叠的patch,然后将维度投影为C,得到X输入到Mixer中。Mixer包含2个MLP,第一个作用于列(所有列共享参数),第二个作用于行(所有行共享参数)。

Mixer公式(S为patch数量)

\begin{aligned} U_{\ast ,i}&=X_{\ast,i}+W_2\sigma(W_1\textup{LayerNorm(X)}_{\ast,i}),i=1,\cdots,C\\ Y_{j,\ast}&=U_{j,\ast}+W_4\sigma(W_3\textup{LayerNorm(U)}_{j,\ast}),j=1,\cdots,S \end{aligned}

        Mixer未使用position embedding,因为token-mixing MLP对输入token的顺序敏感,有可能学习到位置信息。

三、CycleMLP

原文链接:https://arxiv.org/pdf/2107.10224.pdf

实际为上述MLP-Mixer的改进。

传统MLP主要问题:(1)空间维度的MLP不能适应不同的输入大小;(2)channel维度的MLP不能捕捉空间交互。

模型结构

Patch Embedding

        使用大小为7的窗口(步长4)将图片分为有重叠的patch。然后将patch通过线性层得到高维特征。

        不同stage之间有transition部分,减少token数量,增加channel维度。

CycleMLP块

        Channel MLP为2个线性层(channel FC)+GELU。Channel FC和输入图像大小无关,但感受野只有1个像素。

        和传统MLP相比,Cycle MLP使用了Cycle FC层,使MLP类模型能够处理不同大小的输入图片。Cycle FC使用了3个并行的Cycle FC operator。

Cycle FC输出(S_P为感受野大小):

Y_{i,j}=\sum_{c=0}^{C_i-1}F^T_{j,c}\cdot X_{i+c\%S_p,c}

伪核

        将采样点投影到空间平面得到的区域。

四、gMLP

原文链接:https://arxiv.org/pdf/2105.08050.pdf

gMLP(g表示gating)包含L个相同的块,每个块如下:

\begin{aligned} Z&=\sigma(XU)\\ \tilde{Z}&=s(Z)\\ Y&=\tilde{Z}V \end{aligned}

其中\sigma为激活函数,s(\cdot )捕捉空间交互(当s(Z)=Z时为普通的双层MLP),\odot为按元素乘法。模型不需要position embedding,因其可由s捕捉。

        捕捉空间交互最简单的选择是线性层:

f_{W,b}(Z)=WZ+b,s(Z)=Z\odot f_{W,b}(Z)

这里s(\cdot )被称为SGU(spatial gating unit)。有点类似于SE(见5种2D Attention整理中的第三个),只是把池化变成线性层。

        同样有效的方法是,将Z沿channel分为两部分Z_1Z_2,然后

s(Z)=Z_1\odot f_{W,b}(Z_2)

此外可以在SGU中加入一个微型注意力机制,对应的模型称为aMLP。

<think>嗯,用户现在想了解卷积MLP的相关信息或实现方法,也就是卷积神经网络(CNN)与多层感知机(MLP)结合的架构及其实现方式。首先,我需要明确用户的需求,他们可能是在寻找如何将这两种网络结构结合起来的方法,或者想知道这种混合模型的应用场景。 首先,我应该回顾一下CNN和MLP各自的特点。CNN主要用于处理具有网格结构的数据,比如图像,通过卷积层提取空间特征,池化层降低维度,全连接层进行分类。而MLP则是全连接的网络,适合处理向量化的数据,但在处理图像时参数量大,且无法有效捕捉局部特征。结合起来的话,可能是在CNN提取特征后,用MLP进行分类或回归,或者在某些层中混合使用卷积和全连接结构。 接下来,用户提到的参考引用中,引用[2]提到使用MLP和CNN进行姓氏分类,引用[3]提到CNN的工作原理和与BP神经网络的联系。这说明用户可能已经了解了一些基础,需要更深入的结合方法。可能需要解释如何将卷积层和全连接层结合,比如在特征提取阶段使用CNN,然后在分类阶段使用MLP。或者是在同一模型中交替使用卷积层和全连接层,但需要注意参数数量和计算效率。 然后,架构设计方面,常见的结合方式可能包括:CNN作为特征提取器,后面接MLP进行分类;或者在MLP中嵌入卷积层,处理局部特征。需要举例说明,比如LeNet-5的结构,前面是卷积和池化,后面是全连接层。或者更复杂的模型,如ResNet中的全连接层用于分类。 实现方式的话,可能需要用框架如TensorFlow或PyTorch来展示代码示例。比如,先定义卷积层,然后展平特征图,输入到MLP中。需要注意的是数据维度的转换,比如卷积层输出的多维张量需要展平成一维向量才能输入全连接层。 另外,用户可能关心这种混合模型的优势,比如结合了CNN的局部特征提取能力和MLP的全局处理能力。还可能想知道应用场景,比如图像分类、语音识别等,或者具体项目中的实际应用,如引用[2]中的姓氏分类。 还需要考虑可能的优化策略,比如如何调整层数、激活函数的选择、正则化方法等,以防止过拟合。引用[3]提到反向传播和训练方法,可能在实现时需要说明训练过程中的参数更新和损失函数的选择。 最后,用户可能需要了解这种架构的变体或最新进展,比如是否可以使用注意力机制或残差连接来增强模型性能。不过根据问题,可能主要需要基础实现方法,所以保持代码示例简洁明了。 总结一下,回答的结构应该包括:CNN和MLP的结合动机,常见架构设计(如特征提取+分类),实现步骤和代码示例,应用场景,以及相关问题。需要确保LaTeX格式正确,使用$$...$$和$...$,并且引用相关参考文献,如引用[2]和[3]。</think>### 卷积神经网络与MLP结合的架构及实现方式 #### 1. **结合动机** 卷积神经网络(CNN)擅长提取局部特征(如图像的空间信息),而多层感知机(MLP)适合处理全局特征和分类任务。将两者结合,可以在保留局部特征的同时,利用MLP的全局建模能力提升分类性能[^3]。 --- #### 2. **常见架构设计** ##### (1) **特征提取+分类的串联结构** - **流程**:CNN作为前端提取特征 → 展平特征图 → MLP作为后端进行分类。 - **示例架构**: $$ \text{输入图像} \rightarrow \text{卷积层} \rightarrow \text{池化层} \rightarrow \text{Flatten} \rightarrow \text{MLP全连接层} \rightarrow \text{输出} $$ - **优势**:CNN减少参数量的同时保留空间信息,MLP完成高阶非线性映射[^2]。 ##### (2) **混合并行结构** - **流程**:在MLP中嵌入卷积操作,直接处理局部特征。 - **示例**:在MLP的隐藏层中插入卷积层,提取局部模式后传递到全连接层。 --- #### 3. **实现步骤(以PyTorch为例)** ```python import torch import torch.nn as nn class ConvMLP(nn.Module): def __init__(self): super().__init__() # CNN部分:特征提取 self.cnn = nn.Sequential( nn.Conv2d(1, 16, kernel_size=3), # 输入通道1,输出通道16 nn.ReLU(), nn.MaxPool2d(2) # 池化降维 ) # MLP部分:分类 self.mlp = nn.Sequential( nn.Linear(16*13*13, 128), # 展平后输入维度需计算 nn.ReLU(), nn.Linear(128, 10) # 输出类别数 ) def forward(self, x): x = self.cnn(x) # 提取特征 x = x.view(x.size(0), -1) # 展平多维特征图 x = self.mlp(x) # 分类 return x # 示例输入:1通道的28x28图像 model = ConvMLP() input_tensor = torch.randn(32, 1, 28, 28) output = model(input_tensor) ``` --- #### 4. **关键实现细节** - **维度匹配**:卷积层输出需展平为一维向量输入MLP(例如16通道的13x13特征图展平为$16 \times 13 \times 13 = 2704$维)。 - **参数优化**:通过反向传播联合训练CNN和MLP参数[^3]。 - **正则化**:在MLP中使用Dropout或L2正则化防止过拟合。 --- #### 5. **应用场景** 1. **图像分类**:如LeNet-5中CNN+MLP的组合[^1]。 2. **序列数据处理**:在时间序列分析中,CNN提取局部时序模式,MLP建模全局依赖。 3. **多模态任务**:将CNN处理图像特征与MLP处理文本特征结合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

byzy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值