深度学习及相关领域中常见网络与模型汇总

此文记录在深度学习中经典且常见的一系列网络结构与模型(主要集中在cv、nlp领域),对其特征、代码、应用场景等内容进行汇总。

包括Alexnet、Unet、Resnet、Transformer、Diffusion、ViT、Mamba、BERT……

Alexnet

Alexnet是在 2012 年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。当时,AlexNet在 ImageNet 大规模视觉识别竞赛中取得了优异的成绩,把深度学习模型在比赛中的正确率提升到一个前所未有的高度。

AlexNet输入为RGB三通道的224 × 224 × 3大小的图像(也可填充为227 × 227 × 3 )。AlexNet 共包含5 个卷积层(包含3个池化)和 3 个全连接层。

5个卷积层中,每个卷积层都包含卷积核、偏置项、ReLU激活函数和局部响应归一化(LRN)模块。第1、2、5个卷积层后面都跟着一个最大池化层。

后三个层为全连接层。最终输出层为softmax,将网络输出转化为概率值。

img

卷积层:

卷积层C1:使用96个核,对224 × 224 × 3的输入图像进行滤波,卷积核大小为11 × 11 × 3,步长为4。将一对55×55×48的特征图分别放入ReLU激活函数,生成激活图。激活后的图像进行最大池化,size为3×3,stride为2,池化后的特征图size为27×27×48(一对)。池化后进行LRN处理。

卷积层C2:使用卷积层C1的输出(响应归一化和池化)作为输入,并使用256个卷积核进行滤波,核大小为5 × 5 × 48。

卷积层C3:有384个核,核大小为3 × 3 × 256,与卷积层C2的输出(归一化的,池化的)相连。

卷积层C4:有384个核,核大小为3 × 3 × 192。

卷积层C5:有256个核,核大小为3 × 3 × 192。卷积层C5与C3、C4层相比多了个池化,池化核size同样为3×3,stride为2。

其中,卷积层C3、C4、C5互相连接,中间没有接入池化层或归一化层。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)

全连接层:

先Dropout丢掉一部分神经元,以减少过拟合现象的发生。

全连接层1:卷积核size为6×6×256,4096个卷积核生成4096个特征图,尺寸为1×1。然后放入ReLU函数再Dropout处理

全连接层2原理同全连接层。1

全连接层3:全连接层3的输入是上面第二个全连接层的4-96,输出是分类的类别数num_classes,也是1000维softmax的输入,softmax会产生1000个类别预测的值。

1
2
3
4
5
6
7
8
9
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes),
)

ResNet

Resnet于2015年被提出,通过残差学习使深层的网络发挥出作用。

ResNet有如下几个亮点:

  • 相比普通网络每两层/三层之间增加了短路机制,用 shortcut,解决了深度网络中模型退化问题。
  • 提出residual结构(残差结构),并搭建超深的网络结构(突破1000层)
  • 使用Batch Normalization加速训练(丢弃dropout)

Unet

Unet于2015年被提出。广泛的应用在语义分割的各个方向,比如图像分割,工业瑕疵检测等。

Unet 是 Encoder-Decoder 结构,结构简单但很有效。

Unet结构

Unet 网络结构是对称的,下面展示的是Unet源码中内容。

DoubleConv:

这部分就是实现了两次连续的卷积操作,每次卷积后接批归一化 Batch Normalization(对输入进行重新缩放和偏移,提高模型稳定性)和ReLU激活函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class DoubleConv(nn.Module):
"""(convolution => [BN] => ReLU) * 2"""

def __init__(self, in_channels, out_channels, mid_channels=None):
super().__init__()
if not mid_channels:
mid_channels = out_channels
self.double_conv = nn.Sequential(
nn.Conv2d(in_channels, mid_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(mid_channels),
nn.ReLU(inplace=True),
nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)

def forward(self, x):
return self.double_conv(x)

Encoder:

Encoder 由卷积操作和下采样操作组成。

下采样操作代码如下,使用2x2的池化层,并用上面的DoubleConv实现进一步提取特征。

1
2
3
4
5
6
7
8
9
10
11
12
class Down(nn.Module):
"""Downscaling with maxpool then double conv"""

def __init__(self, in_channels, out_channels):
super().__init__()
self.maxpool_conv = nn.Sequential(
nn.MaxPool2d(2),
DoubleConv(in_channels, out_channels)
)

def forward(self, x):
return self.maxpool_conv(x)

Encoder执行下采样过程,在整个Encoder过程中,总共执行4次下采样。具体来说,是双卷积5次,池化4次(看上面的图)。

在Encoder最后,将得到的 feature map 送入 Decoder。

Decoder:

Decoder与Encoder对称。负责上采样操作Upsamplig,恢复原始分辨率。

上采样方式有两种,一种是FCN **中的反卷积**;另一种是 插值

插值部分主要是套公式,其原理大概是将二维插值问题分解为两个方向的线性插值。通过分别在水平方向和垂直方向上进行两次线性插值,可以得到插值点的估计值。在Pytorch里可以直接用 bilinear 插值。

1
nn.Upsample(scale_factor=2, mode='bilinear')

skip-connection:

skip-connection 用于缓解梯度消失问题,并提高训练速度和性能。

Decoder部分中,通过跳跃连接将对应的Encoder输出的特征图与Decoder当前层的特征图进行拼接。这样做的目的是将Encoder中包含的高分辨率信息直接传递给Decoder,从而提高Decoder对细节信息的恢复能力。

事实上,Decoder中只用了一行代码便实现了skip-connection:

1
x = torch.cat([x2, x1], dim=1)

作用:

缓解梯度消失: 由于跳跃连接为梯度提供了额外的路径,梯度可以直接从输出层反向传播到较前面的层,避免了梯度消失的问题。

增强信息流动: 跳跃连接允许原始输入信号绕过若干层直接传递给输出层,这样可以更好地保留输入信息,并且促进不同层之间的信息交互。

提高训练效率: 由于梯度流动更顺畅,网络训练过程中的收敛速度往往会更快,模型性能也会更好。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信