目录
引言
本周阅读了一篇关于新的视觉Transformer模型,称为Swin Transformer的文献,它作为计算机视觉任务的通用骨干网络。与以往基于Transformer的模型不同,Swin Transformer提出了一种分层Transformer,仅在非重叠的局部窗口内计算自注意力,使其与图像大小呈线性关系,因此适用于像素级的密集预测。在阅读文献的同时,还回顾学习了CNN的基础原理知识,有利于平时对文献的解读有更好的理解。
Abstract
This week, I read a literature on a new visual Transformer model called Swin Transformer, which serves as a universal backbone network for computer vision tasks. Unlike previous Transformer based models, Swin Transformer proposes a layered Transformer that only calculates self attention within non overlapping local windows, making it linearly related to image size, making it suitable for pixel level dense prediction. While reading literature, I also reviewed and learned the basic principles of CNN, which is beneficial for better understanding of literature interpretation in daily life.
文献阅读
1、题目
Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
2、引言
本文提出了一种新的视觉Transformer,称为Swin Transformer,它能够作为计算机视觉的通用骨干。将Transformer从语言适应到视觉的挑战来自于两个领域之间的差异,例如视觉实体的规模变化很大,图像中的像素与文本中的单词相比分辨率很高。为了解决这些差异,我们提出了一个分层的Transformer,其表示是用移位窗口计算的。移位加窗方案通过将自注意力计算限制在非重叠的局部窗口同时还允许跨窗口连接来带来更高的效率。这种分层架构具有在各种尺度下建模的灵活性,并且具有相对于图像大小的线性计算复杂度。Swin Transformer的这些特性使其与广泛的视觉任务兼容,包括图像分类(ImageNet-1 K上的87.3 top-1精度)和密集预测任务,如对象检测(COCO testdev上的58.7 box AP和51.1 mask AP)和语义分割(ADE 20 K上的53.5 mIoU瓦尔)。它的性能超过了之前的最先进水平,在COCO上为+2.7框AP和+2.6掩模AP,在ADE 20 K上为+3.2 mIoU,证明了基于Transformer的模型作为视觉骨干的潜力。分层设计和移位窗口方法也证明对全MLP架构贝内。
3、创新点
- Swin Transformer架构中采用了基于移位窗口的自注意力机制,取代了标准的多头自注意力模块。
- 引入了交替的移位窗口分区方法,在连续的Swin Transformer块中实现了跨窗口连接。
- 提出了有效的批处理计算方法,通过循环向左上方向移位,减少了计算复杂度。
- 引入了相对位置偏差机制,提高了在COCO和ADE20K数据集上的性能表现。
4、Swin Transformer出发点
4.1、Transformer在CV领域的应用遇到的问题
- 图像的尺度变化范围非常大,且不符合标准的固定尺度。
- 由于Transformer的计算复杂度是与token数量的平方成正比的,如果将每个像素值视作一个token,其计算量将变得非常庞大。
4.2、Swin Transformer解决上述问题的方法
- Swin Transformer提出了"Shifted Window Mechanism"的方法来解决图像尺度变化范围大且不符合标准的固定尺度问题。即通过将输入的图像分割成一组具有不同尺度的小块(称为局部窗口),然后利用Transformer对这些小块进行处理,从而有效处理尺度变化较大的图像。
- Swin Transformer使用了分层的机制,每个层级的尺度略有不同,这种分层的设计使得模型可以在不同的层级上进行处理,从而减少了整体计算的复杂度。其次,而Swin Transformer采用了局部窗口的注意力机制,即每个位置只与其周围的局部窗口进行关联。这种方式大大减少了注意力机制的计算量。
5、Swin Transformer框架
5.1、整体架构
Swin Transformer模型采取层次化的设计,一共包含4个Stage(可以理解为需要循环执行4层,每层包含不等的Block)。
Swin Transformer体系结构的概述如上图所示,其中说明了微型版本(Swin-T)。它首先将输入的RGB图像分割成不重叠的补丁由补丁分裂模块,如ViT。线性嵌入层被应用于原始值特征,以将其投影到任意维度(表示为C)。在这些补丁令牌上应用具有修改的自注意力计算的几个Transformer块(Swin Transformer块)。Transformer块保持令牌的数量,并与线性嵌入一起被称为“阶段1”。为了产生分层表示,随着网络的深入,通过补丁合并层来减少令牌的数量。第一个面片合并层连接每组2 × 2相邻面片的特征,并在4C维连接特征上应用线性层。这将令牌的数量减少了2 × 2 = 4的倍数(分辨率的2倍下采样),并且输出维度设置为2C。之后应用Swin Transformer块进行特征转换,分辨率保持在H 8 × W 8。将片合并和特征变换的该第一块表示为“阶段2”。该过程重复两次,作为“阶段3”和“阶段4”,输出分辨率分别为H/16 × W/16和H/32 × W/32。这些阶段共同产生一个层次表示,具有与典型卷积网络相同的特征图分辨率。
class SwinTransformer(nn.Module):
def __init__(
self,pretrain_img_size=224, patch_size=4,in_chans=3 embed_dim=96,
depths=[2, 2, 6, 2], num_heads=[3, 6, 12, 24],window_size=7,mlp_ratio=4.0, qkv_bias=True,qk_scale=None, drop_rate=0.0,attn_drop_rate=0.0,drop_path_rate=0.2,norm_layer=nn.LayerNorm, ape=False,patch_norm=True,out_indices=(0, 1, 2, 3), frozen_stages=-1, dilation=False,use_checkpoint=False,):
super().__init__()
self.pretrain_img_size = pretrain_img_size
self.num_layers = len(depths)
self.embed_dim = embed_dim
self.ape = ape
self.patch_norm = patch_norm
self.out_indices = out_indices
self.frozen_stages = frozen_stages
self.dilation = dilation
# split image into non-overlapping patches
self.patch_embed = PatchEmbed(patch_size=patch_size,in_chans=in_chans,embed_dim=embed_dim,norm_layer=norm_layer if self.patch_norm else None,)
# absolute position embedding
if self.ape:
pretrain_img_size = to_2tuple(pretrain_img_size)
patch_size = to_2tuple(patch_size)
patches_resolution = [pretrain_img_size[0] // patch_size[0],pretrain_img_size[1] // patch_size[1]]
self.absolute_pos_embed = nn.Parameter( torch.zeros(1, embed_dim, patches_resolution[0],patches_resolution[1]))
trunc_normal_(self.absolute_pos_embed, std=0.02)
self.pos_drop = nn.Dropout(p=drop_rate)
# stochastic depth
dpr = [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay rule
# build layers
self.layers = nn.ModuleList()
# prepare downsample list
downsamplelist = [PatchMerging for i in range(self.num_layers)]
downsamplelist[-1] = None
num_features = [int(embed_dim * 2**i) for i in range(self.num_layers)]
if self.dilation:
downsamplelist[-2] = None
num_features[-1] = int(embed_dim * 2 ** (self.num_layers -1)) // 2
for i_layer in range(self.num_layers):
layer = BasicLayer(dim=num_features[i_layer],depth=depths[i_layer],num_heads=num_heads[i_layer],window_size=window_size,mlp_ratio=mlp_ratio, qkv_bias=qkv_bias,qk_scale=qk_scale,drop=drop_rate,attn_drop=attn_drop_rate,drop_path=dpr[sum(depths[:i_layer]) : sum(depths[: i_layer + 1])],norm_layer=norm_layer,downsample=downsamplelist[i_layer],use_checkpoint=use_checkpoint,)
self.layers.append(layer)
# num_features = [int(embed_dim * 2 ** i) for i in range(self.num_layers)]
self.num_features = num_features
# add a norm layer for each output
for i_layer in out_indices:
layer = norm_layer(num_features[i_layer])
layer_name = f"norm{i_layer}"
self.add_module(layer_name, layer)
self._freeze_stages()
def _freeze_stages(self):
...
def forward(self, tensor_list: NestedTensor):
x = tensor_list.tensors
x = self.patch_embed(x)
Wh, Ww = x.size(2), x.size(3)
if self.ape:
# interpolate the position embedding to the corresponding size
absolute_pos_embed = F.interpolate(self.absolute_pos_embed, size=(Wh, Ww), mode="bicubic")
x = (x + absolute_pos_embed).flatten(2).transpose(1, 2) # B Wh*Ww C
else:
x = x.flatten(2).transpose(1, 2)
x = self.pos_drop(x)
outs = []
for i in range(self.num_layers):
layer = self.layers[i]
x_out, H, W, x, Wh, Ww = layer(x, Wh, Ww)
if i in self.out_indices:
norm_layer = getattr(self, f"norm{i}")
x_out = norm_layer(x_out)
out = x_out.view(-1, H, W, self.num_features[i]).permute(0, 3,1,2).contiguous()
outs.append(out)
# collect for nesttensors
outs_dict = {}
for idx, out_i in enumerate(outs):
m = tensor_list.mask
assert m is not None
mask = F.interpolate(m[None].float(),size=out_i.shape[-2:]).to(torch.bool[0]
outs_dict[idx] = NestedTensor(out_i, mask)
return outs_dict
5.2、Swin Transformer组件
- Patch Partition: 将输入的图像分割成图像块(patch),并将每个图像块转换成嵌入向量作为 Transformer 模型的输入。
- Patch Merging: 主要作用是将相邻层级的特征图进行合并,以实现多尺度的特征融合和降低计算复杂度。
- W-MSA: 窗口自注意力机制,它在处理图像时将注意力局限于特定的窗口,从而减少了计算和存储开销。
- SW-MSA: 滑动窗口自注意力机制,通过局部平移操作(shift)将窗口沿着宽度和高度方向移动,以获取不同的局部邻域信息,这样可以确保W-MSA中不同窗口内的信息之间能够交互,并减少计算量。 Note: W-MSA与SW-MSA是成对出现的,也就说每层的Swin Transformer Block都必须是偶数
5.3、Swin Transformer流程
- 输入的图像经过Patch Partition被切成一个个图像块,并将每个图像块转换成嵌入向量Embedding。
- 图像嵌入被送到Swin Transformer Stage中循环执行Stage内的操作。(4个Stage,每个Stage内2*-Block),具体一个Stage内的操作:
图像嵌入送入到第一个Block中执行LN->W-MSA(relative_position_bias)->LN->MLP操作,重构图像嵌入
重构的图像嵌入送入到第二个Block中执行LN->SW-MSA(relative_position_bias)->LN->MLP操作,得到新的图像嵌入
循环执行完Stage内所有的Block
新的图像嵌入被送入到Patch Merging中执行下采样,减少图片的分辨率。
5.4、基于移位窗口的自注意
非重叠窗口中的自注意力为了高效建模,我们建议在局部窗口内计算自注意力。窗口被布置为以非重叠的方式均匀地划分图像。假设每个窗口包含M×M个面片,则全局MSA模和基于窗口的MSA模的计算复杂度分别为在h ×w贴片的图像上:
基于窗口的自注意模块缺乏跨窗口的连接,这限制了其建模能力。为了在保持非重叠窗口的有效计算的同时引入跨窗口连接,提出了一种移位窗口分区方法,该方法在连续的Swin Transformer块中的两个分区配置之间交替。如下图所示:
第一个模块使用从左上角像素开始的常规窗口划分策略,将8 × 8特征图均匀划分为大小为4 × 4(M = 4)的2 × 2窗口。然后,下一个模块采用从前一层的窗口移位的窗口配置,通过将窗口从规则划分的窗口移位()个像素。
本文提出了一种更有效的批处理计算方法,即向左上方循环移位,如下图所示:
在该移位之后,批处理窗口可以由在特征图中不相邻的若干子窗口组成,因此采用掩蔽机制来将自注意力计算限制在每个子窗口内。通过循环移位,批量窗口的数量与常规窗口划分的数量保持相同,因此也是有效的。
5.5、架构变体
本文构建了我们的基础模型,称为Swin-B,具有类似于ViTB/DeiT-B的模型大小和计算复杂性。还有Swin-T,Swin-S和Swin-L,它们分别是模型大小和计算复杂度的0.25倍,0.5倍和2倍。请注意,Swin-T和Swin-S的复杂度分别与ResNet-50(DeiT-S)和ResNet-101相似。窗口大小默认设置为M = 7。对于所有实验,每个头的查询维度为d = 32,并且每个MLP的扩展层为α = 4。这些模型变体的架构超参数是:
6、实验
6.1、基于ImageNet-1K的图像分类
下表显示了使用常规ImageNet-1K训练与其他主干的比较,包括基于Transformer和基于ConvNet的。与之前最先进的基于变压器的架构相比,Swin变压器明显优于具有类似复杂性的DeiT架构:使用输入,Swin-T(81.3%)比DeiT-S(79.8%)分别增加1.5%,使用/输入,Swin-B(83.3%/84.5%)比DeiT-B(81.8%/83.1%)分别增加1.5%/1.4%。
下表对于Swin-B,ImageNet-22K预训练比ImageNet-1K从头开始的训练带来了1.8%到1.9%的增益。与之前ImageNet-22 K预训练的最佳结果相比,模型实现了更好的速度-准确性权衡:Swin-B获得了86.4%的top-1准确率,比ViT高2.4%,具有相似的推理吞吐量(84.7 vs. 85.9图像/秒)和略低的FLOP(47.0G vs. 55.4G)。较大的Swin-L模型达到了87.3%的top-1准确率,比Swin-B模型高出+0.9%。
6.2、COCO上的目标检测
与ResNe(X)t的比较中 下表(a)列出了Swin-T和ResNet-50在四个对象检测框架上的结果。Swin-T架构带来了比ResNet-50一致的+3.4~4. 2盒AP增益,模型大小、FLOP和延迟略大。
与ResNe(X)t的比较,Swin Transformer实现了51.9 box AP和45.0 mask AP的高检测准确度,这比ResNeXt101-64x4d显著提高了+3.6 box AP和+3.3 mask AP,ResNeXt101-64x4d具有相似的模型大小,FLOPs和延迟。在使用改进的HTC框架的52.3 box AP和46.0 mask AP的较高基线上,Swin Transformer的增益也很高,为+4.1 box AP和+3.1 mask AP。
与DeiT的比较,使用级联掩码R-CNN框架的DeiT-S的性能如下表(b)所示。Swin-T的结果比DeiT-S高+2.5 box AP和+2.3 maks AP,具有相似的模型大小(86 M与80 M)和显著更高的推理速度(15.3 FPS与10.4 FPS)。DeiT的推理速度较低,主要是由于其复杂度是输入图像大小的二次方。下表(c)将本文的最佳结果与先前最先进模型的结果进行了比较。最佳模型在COCO测试开发中实现了58.7 box AP和51.1 maks AP,超过了之前的最佳结果+2.7 box AP和+2.6 mask AP。
6.3、基于ADE20K的语义分割
下表3出了不同方法/主干对的mIoU、模型大小(#param)、FLOP和FPS。从这些结果可以看出,Swin-S比DeiT-S高+5.3 mIoU(49.3 vs. 44.0),具有相似的计算成本。它也比ResNet-101高+4.4 mIoU,比ResNeSt-101高+2.4 mIoU 。使用ImageNet-22K预训练的Swin-L模型在瓦尔集上实现了53.5 mIoU,超过了之前的最佳模型+3.2 mIoU。
7、结论
Swin Transformer的提出解决了之前Transformer应用在CV领域的缺点,具有以下优势:
- 分级特征表示:Swin-T引入分级特征表示,将图像按层次进行划分,允许底层特征捕获更局部、细节的信息,高层特征则能够捕获更全局、抽象的信息。这种分级特征表示的设计使得模型能够更好地处理不同尺度的特征。
- 低计算成本:相对于传统的全局自注意力机制,Swin-T的窗口注意力机制降低了计算复杂度,使得模型更加高效。此外,Swin-T还使用了相对位置编码和间距实现的移位操作,进一步提升了计算效率。
- 泛化能力:Swin-T在大规模图像分类任务上进行了训练,并在多个数据集上进行了评估,展示了良好的泛化能力和通用性。与其他视觉Transformer模型相比,Swin-T在许多图像分类任务上取得了更好的性能。
深度学习 卷积神经网络原理
1、图像原理
图像在计算机中是通过数字(0-255)来表示的,每个数字代表图像中一个像素的亮度或颜色信息。其中
-
黑白图像:每个像素只有一个值,这个值在0(黑色)到255(白色)之间变化。
-
彩色图像:每个像素包含三个值,最常见的是RGB(Red-Green-Blue)模型,即红色、绿色和蓝色光以不同强度组合起来产生各种颜色。每个颜色通道都有256级亮度,从0~255,因此每种颜色可以用一个8位的二进制数来表述,例如(255,0,0)表示红色,(0,255,0)表示绿色,(0,0,255)表示蓝色,其他组合则对应各种颜色。计算机中,彩色图像的数据结构通常是一个三维数组或张量,形状为(宽度,高度,深度),其中深度就是通道的数量,对于RGB图像来说,深度是3。这意味着,对于每个像素位置,有三个数值分别代表红绿蓝三个通道的亮度。例如,一个100*100像素的RGB图像将占用100x100x3个字节的内存。
这里“8位的二进制数”怎么理解呢?
在RGB颜色模型中,每个颜色通道(红、绿、蓝)可以有256个不同的亮度级别,每个通道用8位二进制表示。8位二进制数的最大值是11111111,转化成十进制就是255;最小值是00000000,转化成十进制就是0。
2、卷积神经网络CNN
说起CNN,必然会首先想到的是CV,而边缘检测可谓是CV中家喻户晓的一种应用场景。以原始图片尺寸为10x10为例,如下图所示,其左半部分是像素值较大,是明亮区域;右半部分像素值较小,为深度区域。中间的分界线即就是要检测的边缘。
检测边缘的方式:此时滤波器filter(也叫kernel)出场了,如下图所示,kernel尺寸为3x3。
滤波器filter滑过输入图片,在每个区域处稍做停留,对应元素相乘再相加计算,之后再向其它区域滑动继续计算,直到滑动至原图片的最后一个区域为止。这个过程即为卷积。
由上图可以看出,输出结果的中间颜色浅,两边颜色深,说明原图的边界已反应出来。因此可以总结出,边缘检测就是通过输入图片与相应滤波器进行卷积运算得以识别。
另外,这里的滑动还涉及到一个基本概念,步长stride,上述示例中,是以stride为1说明,每次滑动一格,共停留了8x8个区域,所以最终输出结果是8x8矩阵。
那么,究竟什么是卷积神经网络呢?
经过上面边缘检测这一具体的目标检测场景的分析,我们也就不难理解,CNN(Convolutional neural network)就是通过各种各样的滤波器filter不断提取图片特征,从局部到整体,进而识别目标。
而在神经网络中,这些filter中的每个数字,就是参数,可通过大量数据训练得到(即深度学习的过程)。
3、CNN中的基本概念
3.1、卷积(Convolution)
卷积计算
卷积是数学分析中的一种积分变换的方法,而在图像处理中则采用的是卷积的离散形式。在卷积神经网络CNN中,卷积层的实现方式本质即为数学中定义的互相关计算(cross-correlation)。具体计算过程如下图所示。
其中,
图(a):左边的图大小是3×3,表示输入数据是一个维度为3×3的二维数组;中间的图大小是2×2,表示一个维度为 2×2的二维数组,也即为卷积核。卷积核的左上角与输入数据的左上角(0,0)对齐,并依次将二者对应位置数据相乘,再相加,即可获得卷积输出的第一个结果25。
依次类推,图(b)、(c)、(d)分别为卷积输出的第二、三、四个输出结果。
图片卷积运算
那么图片卷积运算,具体是怎么回事呢?如下图所示即为彩色图像卷积过程。
对于彩色图像的通道1(Red)、通道2(Green)、通道3(Blue),分别使用Kernel1、Kernel2、Kernel3。每个卷积核在对应的单色图像上滑动,对每个位置上的小块区域(Kernel大小)内的像素值与卷积核的相应元素进行逐点乘法运算,然后将这些乘积相加得到一个值。再将每个通道得到的数值相加,并加上总体的偏置Bias,即可得到对应特征图(feature map)中的一个值。
立体效果如下图所示
3.2、Padding
如上所述边缘检测的例子中,可以看到,原图片尺寸是10x10,经过filter之后是8x8。如果再做一次卷积运算就是6x6...这样的话会有两个缺点:
-
每次做卷积操作,输出图片尺寸缩小
-
角落或边缘区域的像素点在输出中采用较少,因此容易丢掉图像边缘位置的许多信息。
如下图中左上角红色阴影只被一个输出触碰到,而中间的像素点(紫色方框标记)会有许多3x3的区域与之重叠。所以,角落或边缘区域的像素点在输出中采用较少,容易丢掉图像边缘位置的许多信息。
为了解决这一问题,通常采用Padding的方法,在卷积操作之前,先给原图片边缘填充一层像素, 例如,将10x10的图像即可填充为12x12的大小,卷积之后的图片尺寸为8x8,和原始图片一样大,这样便使得原图的边缘区域像素点也可以多次被采用。
选择填充多少像素,通常有两种选择:
-
Same卷积:即如上所述,填充再卷积之后的图片大小与原图片一致。
-
Valid卷积:不进行填充操作,直接卷积。
3.3、stride
stride的概念在引言中有提到过,表示过滤器filter在原图片中水平方向和竖直方向每次滑动的长度,也叫步进长度。
假设s表示stride长度,p表示padding长度,原图片尺寸是n x n,过滤器filter尺寸是f x f,则卷积后的图片尺寸为:
3.4、池化
池化的本质就是降维。
卷积网络中池化层的作用:降低特征图的参数量、提升计算速度、增加感受野,也即为一种降采样操作。
物体检测中常用的池化:最大值池化(Max Pooling)与平均值池化(Average Pooling)。
Max pooling
即在滤波器filter滑动区域内取最大值,而无需卷积运算。数字大意味着可能探测到了某些特定的特征,忽略了其它值,降低了噪声影响,提高了模型健壮性。并且,Max pooling需要的超参数仅为滤波器尺寸f和stride长度s,无需要训练其它参数,计算量较小。
Average pooling
即在滤波器filter滑动区域内求平均值
3.5、Shape
在处理多维数据,尤其是图像数据时,Tensorflow和Pytorch数据Shape有所区分。
-
TensorFlow:(batch_size, height, width, in_channels)
-
Pytorch:(batch_size, in_channels, height, width)
其中,
-
batch_size:批量处理的样本数量。
-
in_channels:输入图像的通道数,对于彩色图像通常是3(红、绿、蓝)。
-
height和width分别是图像的高度和宽度。
如上图所示,
-
输入图片Shape:[height, width, channels],即[8,8,3],表示一个8x8的图像,有3个通道(R、G、B)。
-
卷积核Shape:[kernel_height, kernel_width, in_channels, out_channels],即[3,3,3,5],表示一个3x3的卷积核,有3个通道(R、G、B),输出通道数是5。
-
输出图片Shape:[height, width, out_channels],即[6,6,5],表示一个6x6的输出图片,有5个通道(R、G、B)。
out_height = (height - kernel_height + 1) / stride
out_width = (width - kernel_width + 1) / stride
对于8x8的图像和3x3的卷积核,输出尺寸将是 (8 - 3 + 1) / 1 = 6
,因此输出形状是 [6, 6, 5]
,表示一个6x6的特征图,有5个输出通道。
卷积核的输入通道数(in_channels)由输入图像的通道数决定,比如:一个RGB格式的图片,其输入通道数为3。
而输出矩阵的通道数(out_channels)是由卷积核的输出通道数所决定,即卷积核有多少个不同的滤波器(filter)。在这个例子中,卷积核有5个滤波器,所以输出有5个通道。
3.6、激活函数
并不是所有的映射关系都可以用线性关系准确表达。因此需要激活函数表示非线性映射。
激活函数也就是非线性映射。神经网络如果仅仅是由线性运算堆叠,是无法形成复杂的表达空间的,也就很难提取高语义信息,因此需要加入非线性映射关系。
Sigmoid函数
Sigmoid函数将特征压缩到了(0,1)区间,0端是抑制状态,1端是激活状态,中间部分梯度最大。
Relu函数
修正线性单元(Rectified Linear Unit, ReLU)。通常用于缓解梯度消失现象。
在小于0的部分,值与梯度为0,大于0导数为1,避免了Sigmoid函数中梯度接近于0导致的梯度消失问题
Softmax函数
多物体类别较为常用的分类器是Softmax函数。
在具体的分类任务中,Softmax函数的输入往往是多个类别的得分,输出则是每一个类别对应的概率,所有类别的概率取值都在0~1之间,且和为1。
Softmax函数公式如下:
其中,Vi表示第i个类别的得分,C代表分类的类别总数,输出Si为第i个类别的概率。
4、CNN整体结构
卷积神经网络CNN由输入层、卷积层、Relu、池化层和全连接层、输出层组成。
如下图所示是一个卷积网络示例,卷积层是卷积网络的第一层,其后跟着其它卷积层或池化层,最后一层是全连接层。越往后的层识别图像越大的部分,较早的层通常专注于简单的特征(例如颜色和边缘等)。随着图像数据在CNN中各层中前进,它开始识别物体的较大元素或形状,直到最终识别出预期的物体。
其中,
-
输入层:接收原始图像数据,作为网络的输入。
-
卷积层:由滤波器filters和激活函数构成,属于CNN的核心层,主要作用是提取样本特征。它由输入数据、filter(或卷积核)和特征图组成。若输入数据是RGB图像,则意味着输入将具有三个维度——高度、宽度和深度。filter的本质是一个二维权重矩阵,它将在图像的感受野中移动,检查特征是否存在。卷积的运算过程如上所述。卷积层一般要设置的超参数包括过滤器filters的数量、步长stride以及Padding的方式(valid or same)以及激活函数等。
-
池化层:本质即就是下采样(Downsampling),利用图像局部相关性原理,对图像进行子抽样,在保留有用信息的前提下减小数据处理量,具有一定的防止模型过拟合作用。
-
全连接层:该层的每一个结点与上一层的所有结点相连,用于将前边提取到的特征综合在一起。通常,全连接层的参数是最多的。
-
输出层:根据全连接层的信息得到概率最大的结果。
总结
本周阅读研究了一种新的架构,Swin Transformer,它应用自注意机制为视觉特征生成分层表示。并且对CNN的原理进行了回顾,对CV领域的知识有了更深的理解。