四、ConvNext代码
1、大体框架介绍
以ConvNext-Tiny为例:
其中,ConvNext包括:
(1)最底层的Stem层:对原始的图像进行预处理。
(2)四个Stage:每个Stage重复若干block,其中重复的次数为深度。
例如:第一个Stage重复了3个block,即深度为3。
(3)分类的代码:对特征进行下采样/池化,然后映射到我们要做分类的类别上。
2、代码解释
代码解释:
1)第一层为群卷积Group_Conv:设置group_nums=input_channels,其卷积为7x7 输出通道数为96。
2)第二层为1X1的卷积:做通道融合,也可称作一个MLP,即把上一个张量96,映射为384。不考虑周围像素点,只对单个像素点进行考虑,即不考虑空间的局部关联性。
3)第三层为1X1的卷积:即将384映射为96。
4)LN:Layer-Normalization:层归一化。
5)GELU:激活函数。
6)输入输出相结合。
(1)定义Block类:
Class Block(nn.Module): #无论是多大的模块,都需要继承自nn.Module;
(2)定义Class Block类中的init函数:
实例化一些层。
def __init__(self, dim, drop_path=0., layer_scale_init_value=1e-6):
super().__init__()
self.dwconv = nn.Conv2d(dim, dim, kernel_size=7, padding=3, groups=dim) # 实例化二维卷积--depthwise conv(深度可分离卷积),设置groups等于输入通道数
self.norm = LayerNorm(dim, eps=1e-6) #在通道上做层归一化。在做层归一化之前,张量=batchsize x H x W x channels,将张量送至层归一化中,得出均值及方差,其大小为batchsize x H x W,每个均值和方差的向量的大小为通道数目。有了均值和方差便可以进行归一化至正态分布,再引用两个仿射变换参数(权重和偏置),再变换至新的分布。