从零搭建CBAM、SENet、STN、transformer、mobile_vit、simple_vit、vit模型(Pytorch代码示例)
@TOC
CBAM
CBAM(Convolutional Block Attention Module)是一种注意力机制,可以在现有的卷积神经网络(CNN)中插入,以增强模型对重要特征的关注。CBAM 通过同时考虑通道维度和空间维度的注意力,提高了模型的表征能力和性能。以下是 CBAM 的一些关键特点和实现细节:
CBAM 的关键特点
- 通道注意力(Channel Attention):通过计算每个通道的重要性权重,增强或抑制特定通道的特征。
- 空间注意力(Spatial Attention):通过计算每个位置的重要性权重,增强或抑制特定区域的特征。
- 轻量级:CBAM 可以轻松地插入到现有的 CNN 架构中,而不会显著增加计算复杂度。
CBAM 的基本结构
CBAM 包括两个主要模块:通道注意力模块和空间注意力模块。
- 通道注意力模块(Channel Attention Module)
最大池化:对输入特征图进行最大池化操作。
平均池化:对输入特征图进行平均池化操作。
共享多层感知机(MLP):通过两个全连接层(FC)来学习通道的重要性权重。
Sigmoid 激活:将 MLP 的输出通过 Sigmoid 函数转换为权重。 - 空间注意力模块(Spatial Attention Module)
最大池化:对输入特征图进行最大池化操作。
平均池化:对输入特征图进行平均池化操作。
卷积层:通过一个 7x7 的卷积层来学习空间的重要性权重。
Sigmoid 激活:将卷积层的输出通过 Sigmoid 函数转换为权重。
1 | |
SENet
SENet(Squeeze-and-Excitation Network)是一种通过引入注意力机制来增强卷积神经网络(CNN)性能的方法。SENet 通过动态地重新校准特征通道的重要性,使得模型能够更好地关注重要的特征,从而提高模型的表征能力和泛化能力。以下是 SENet 的一些关键特点和实现细节:
SENet 的关键特点
- Squeeze 操作:通过全局平均池化(Global Average Pooling)将每个特征通道压缩成一个全局描述符,捕获每个通道的全局信息。
- Excitation 操作:通过两个全连接层(FC)学习每个通道的重要性权重,这些权重通过 Sigmoid 激活函数转换为 [0, 1] 范围内的值。
- Scale 操作:将学习到的权重与原始特征图相乘,增强或抑制特定通道的特征。
SENet 的基本结构
SENet 通过在传统的卷积块中插入 SE 模块来实现注意力机制。SE 模块包括以下步骤:
- Squeeze 操作:对输入特征图进行全局平均池化,得到每个通道的全局描述符。
- Excitation 操作:通过两个全连接层学习每个通道的重要性权重。
- Scale 操作:将学习到的权重与原始特征图相乘,得到增强后的特征图。
1 | |
STN
STN(Spatial Transformer Networks)是一种用于在卷积神经网络(CNN)中进行空间变换的技术。STN 可以动态地对输入图像进行空间变换,如平移、旋转、缩放等,从而提高模型的鲁棒性和泛化能力。STN 通过引入一个可学习的空间变换模块,使得模型能够自适应地调整输入图像的位置和姿态,从而更好地捕捉特征。
STN 的关键特点
- 局部化网络(Localization Network):用于预测变换参数的网络,通常是一个小的 CNN。
- 网格生成器(Grid Generator):根据预测的变换参数生成采样网格。
- 采样器(Sampler):根据生成的采样网格对输入图像进行采样,生成变换后的图像。
STN 的基本结构
STN 的基本结构包括三个主要部分:
- 局部化网络:接收输入图像并输出变换参数。
- 网格生成器:根据变换参数生成采样网格。
- 采样器:根据采样网格对输入图像进行采样,生成变换后的图像。
1 | |
transformer
Transformer 是一种基于自注意力机制(Self-Attention Mechanism)的深度学习模型,最初由 Vaswani 等人在 2017 年的论文《Attention is All You Need》中提出。Transformer 模型在自然语言处理(NLP)任务中取得了显著的成功,尤其是在机器翻译、文本生成、问答系统等领域。以下是 Transformer 的一些关键特点和实现细节:
Transformer 的关键特点
- 自注意力机制(Self-Attention Mechanism):允许模型在处理序列数据时,关注序列中的不同位置,从而捕捉长距离依赖关系。
- 前馈神经网络(Feed-Forward Neural Network):每个位置的特征经过相同的前馈神经网络进行处理。
- 位置编码(Positional Encoding):由于 Transformer 模型本身不包含序列顺序信息,因此需要添加位置编码来保留序列的顺序信息。
- 多头注意力机制(Multi-Head Attention):通过多个不同的注意力头来捕捉不同类型的依赖关系,提高模型的表达能力。
Transformer 的基本结构
Transformer 模型主要由编码器(Encoder)和解码器(Decoder)组成。每个编码器和解码器都包含多个相同的层。
- 编码器(Encoder)
多头自注意力机制(Multi-Head Self-Attention):对输入序列进行自注意力计算。
前馈神经网络(Feed-Forward Neural Network):对每个位置的特征进行非线性变换。
残差连接(Residual Connections):在每个子层之后添加残差连接,以缓解梯度消失问题。
层归一化(Layer Normalization):在每个子层之后进行层归一化,以稳定训练过程。 - 解码器(Decoder)
多头自注意力机制(Multi-Head Self-Attention):对目标序列进行自注意力计算。
多头编码器-解码器注意力机制(Multi-Head Encoder-Decoder Attention):对编码器的输出和目标序列进行交叉注意力计算。
前馈神经网络(Feed-Forward Neural Network):对每个位置的特征进行非线性变换。
残差连接(Residual Connections):在每个子层之后添加残差连接。
层归一化(Layer Normalization):在每个子层之后进行层归一化。
1 | |
mobile_vit
MobileViT 是一种轻量级的视觉 Transformer 模型,旨在在移动设备上高效运行。它结合了卷积神经网络(CNN)和 Transformer 的优点,通过引入一种新的模块——MobileViT Block,实现了在保持高性能的同时降低计算复杂度。MobileViT 在图像分类、目标检测和语义分割等任务中表现出色,特别适合资源受限的设备。
MobileViT 的关键特点
- MobileViT Block:结合了卷积和 Transformer 的优点,通过局部和全局信息的融合来提高模型的表达能力。
- 轻量级设计:通过使用高效的卷积操作和 Transformer 结构,使得模型在保持高性能的同时具有较低的计算复杂度。
- 多尺度特征提取:通过多尺度的特征提取,提高了模型对不同尺度特征的捕捉能力。
MobileViT 的基本结构
MobileViT 主要由以下几个部分组成:
- Stem:初始的卷积层,用于提取低级别的特征。
- MobileViT Blocks:核心模块,结合了卷积和 Transformer 的优点。
- Global Pooling:全局池化层,用于将特征图降维。
- Classification Head:最终的分类头,用于输出分类结果。
MobileViT Block 的详细结构
MobileViT Block 是 MobileViT 的核心模块,其结构如下:
- Local Representation:通过卷积操作提取局部特征。
- Global Representation:通过 Transformer 提取全局特征。
- Fusion:将局部特征和全局特征进行融合。
具体步骤如下:
局部特征提取:
- 使用卷积层提取局部特征。
全局特征提取:
- 将局部特征展平并重塑为序列形式。
- 使用 Transformer 进行全局特征提取。
特征融合:
- 将全局特征重塑回特征图形式。
- 与局部特征进行融合。
1 | |
simple_vit
SimpleViT 是一个简化版的 Vision Transformer (ViT) 模型,旨在降低原始 ViT 的复杂性和计算成本,同时保持一定的性能。ViT 模型的核心思想是将图像视为一系列的 patch,然后通过 Transformer 架构进行处理。SimpleViT 通常会减少层数、隐藏维度或其他参数,以适应更小的计算资源或更快的推理速度。
SimpleViT 的关键特点
- 简化架构:减少了原始 ViT 的层数和隐藏维度,降低了模型的复杂度。
- 高效性:适合在资源受限的环境中运行,如移动设备或嵌入式系统。
- 易于实现:代码相对简单,便于理解和修改。
SimpleViT 的基本结构
SimpleViT 主要由以下几个部分组成:
- Patch Embedding:将图像分割成一系列 patch,并将每个 patch 转换为嵌入向量。
- Positional Encoding:为每个 patch 添加位置信息,以便模型能够理解 patch 的顺序。
- Transformer Encoder:通过多个 Transformer 编码器层对 patch 嵌入进行处理。
- Classification Head:最终的分类头,用于输出分类结果。
Patch Embedding
Patch Embedding 将图像分割成一系列固定大小的 patch,并将每个 patch 转换为一个嵌入向量。具体步骤如下:
- 分割图像:将图像分割成一系列固定大小的 patch。
- 线性变换:将每个 patch 展平并通过线性变换转换为嵌入向量。
- 添加类别标记:在嵌入向量序列的开头添加一个类别标记(cls token),用于最终的分类任务。
Positional Encoding
由于 Transformer 模型本身不包含序列顺序信息,因此需要添加位置编码来保留 patch 的顺序信息。位置编码可以通过正弦和余弦函数生成。
Transformer Encoder
Transformer Encoder 包含多个相同的编码器层,每个编码器层包含多头自注意力机制和前馈神经网络。具体步骤如下:
- 多头自注意力机制:对 patch 嵌入进行自注意力计算。
- 前馈神经网络:对每个位置的特征进行非线性变换。
- 残差连接:在每个子层之后添加残差连接,以缓解梯度消失问题。
- 层归一化:在每个子层之后进行层归一化,以稳定训练过程。
Classification Head
Classification Head 通过一个线性变换将最终的类别标记嵌入转换为分类结果。具体步骤如下:
- 获取类别标记嵌入:从 Transformer Encoder 的输出中获取类别标记嵌入。
- 线性变换:将类别标记嵌入通过线性变换转换为分类结果。
1 | |
vit
1 | |