文献阅读ZFNet

摘要

本周主要学习了ZFNet,AlexNet是第一个在大规模图像分类竞赛ImageNet上取得显著优势的CNN模型。ZFNet的目的是尝试改进AlexNet的性能,进一步提高图像分类的准确性。ZFNet提出了一种新的网络结构。它采用了更小的卷积核、更大的卷积步长和更深的网络层次,通过增加网络的层数来增加模型的表达能力。这种深度网络结构的引入对于提高图像分类性能起到关键作用,并为后续更深层次的模型设计奠定了基础。与AlexNet类似,ZFNet也采用了深层的卷积层堆叠。具体来说,它包含了5个卷积层,这些卷积层用来提取图像的特征。这些卷积层的组合允许网络学习图像的低级和高级特征,从边缘和纹理到更复杂的物体部分。ZFNet引入了一种称为“反卷积”的技术,用于可视化网络的中间层特征映射。这使得研究人员可以更好地理解网络如何在图像中学到特征,并且有助于可视化网络对不同特征的敏感性。ZFNet可以看作是深度学习领域中卷积神经网络发展的一个重要里程碑,它在AlexNet的基础上进行了一些关键的改进,提高了图像分类和特征学习的性能。它的成功也为后续更深、更复杂的神经网络架构铺平了道路。最后进行了pytorch代码实践。

Abstract

This week’s study focused on ZFNet. AlexNet was the first Convolutional Neural Network (CNN) model to achieve significant success in the large-scale image classification competition, ImageNet. The purpose of ZFNet was to try to improve the performance of AlexNet and further enhance the accuracy of image classification. ZFNet introduced a new network structure. It utilized smaller convolutional kernels, larger convolutional strides, and deeper network layers, increasing the model’s expressive power by adding more layers. The introduction of this deep network structure played a key role in improving image classification performance and laid the foundation for subsequent designs of deeper models. Similar to AlexNet, ZFNet also used deep stacks of convolutional layers. Specifically, it included five convolutional layers used to extract features from images. The combination of these layers allowed the network to learn both low-level and high-level features, from edges and textures to more complex parts of objects. ZFNet introduced a technique known as “deconvolution” for visualizing the feature maps of intermediate layers in the network. This allowed researchers to better understand how the network learned features in images and helped visualize the network’s sensitivity to different features. ZFNet can be considered an important milestone in the development of CNNs in the field of deep learning. It made key improvements over AlexNet, enhancing performance in image classification and feature learning. Its success also paved the way for subsequent deeper and more complex neural network architectures. Finally, practical implementation using PyTorch was conducted.

1、研究背景和目的

在深度学习复兴之前,传统的计算机视觉方法通常需要手动设计特征提取器,这在处理复杂数据集和大规模图像分类问题时存在一定的限制。然而,随着计算能力的增加、更好的训练技术的出现以及大规模标记数据集的可用性,深度学习再次引起了计算机视觉领域的关注。图像分类一直是计算机视觉领域的一个重要问题,因此需要更好的深度学习方法来解决这个任务。在此背景下,ZFnet的研究致力于进一步提高深度卷积神经网络在大规模图像分类任务上的性能。研究人员希望通过使用大型数据集(如ImageNet)和深度卷积神经网络,提高图像分类的准确性,并超越之前的最先进方法。同时,他们还尝试引入新的正则化技术,以防止过拟合,并强调了使用GPU来加速深度网络训练的重要性。

2.主要内容

ZFNet在2013年 ILSVRC 图像分类竞赛获得冠军,错误率11.19% ,比去年的AlexNet降低了5%,ZFNet是由 Matthew D.Zeiler 和 Rob Fergus 在 AlexNet 基础上提出的大型卷积网络。AlexNet是第一个在大规模图像分类竞赛ImageNet上取得显著优势的CNN模型。ZFNet的目的是尝试改进AlexNet的性能,进一步提高图像分类的准确性。ZFNet解释了为什么卷积神经网络可以在图像分类上表现的如此出色,以及研究了如何优化卷积神经网络。为了改进AlexNet,ZFNet提出了一种新的网络结构。它采用了更小的卷积核、更大的卷积步长和更深的网络层次。这些改变有助于增加网络的感受野(receptive field),从而更好地捕捉图像中的局部和全局特征。

2.1 ZFNet网络架构

ZFNet网络结构和AlexNet保持一致,但是卷积核的大小和步长发生了变化。

12

从上面可以看出,ZFNet相较于AlexNet的改进主要在两点:

(1)第一个卷积层的大小从1111改为了77,步长从4改为了2

作出这样调整的依据就是通过特征图可视化来实现的,作者通过可视化AlexNet第一层和第二层的特征,发现比较大的stride和卷积核提取的特征不理想,所以作者将第一层的卷积核从1111减小到77,实验说明,这样有助于分类性能的提升。

另外通过特征可视化可以知道,Krizhevsky的CNN结构学习到的第一层特征只对于高频和低频信息有了收敛,但是对于中层信息却还没有收敛;同时,第二层特征出现了混叠失真,这个主要是因为第一个卷积层的层的步长设置为4引起的,为了解决这个问题,作者不仅将第一层的卷积核的大小设置为7*7,同时,也将步长设置为2(对AlexNet的改进)。

(2)将3、4、5层卷积核的数量由384、384、256调整为512、1024、512

2.2 ZFNet要点

2.1 通过反卷积可视化
  可视化可以理解卷积网络的操作需要解释中间层的特征活动。ZFNet提出了一种新颖的方法来将这些活动映射回输入像素空间,显示最初在特征映射中引起给定激活的输入模式。ZFNet使用反卷积网络(deconvnet)实现此映射。反卷积网络可以被认为是一个使用相同组件(过滤,池化)的逆向的卷积模型,即不是将像素映射到特征,而是将特征映射到像素。,它们不会用于任何学习能力,仅作为对已经训练好的卷积网络的探索。
ZF2

如上图所示,为了检查一个卷积网络,网络的每个层都附有一个反卷积网络,提供了一条返回图像像素的连续路径。首先,将输入图像呈现给卷积网络并通过所有层计算特征。为了检查给定卷积网络的激活,我们将图层中的所有其他激活设置为零,并将特征图作为输入传递给附加的反卷积网络层。然后我们依次反池化、纠正和过滤以重建下面的层中的活动,从而产生所选择的激活。 然后重复这一过程,直到达到输入像素空间。

反池化:池化的逆运算,但可以用一组转换变量switch在每个池化区域中通过记录最大值的位置来获得一个近似逆。在反卷积网中,反池化操作使用这些转换来放置上述最大值的位置,保存激活的位置,其余位置都置0。
纠正:卷积网中使用非线性的ReLU来修改特征图来确保特征图总是正值。为了获得在每层的有效(也应该是正值)的特征重建,也在反卷积网中利用了ReLU。
滤波:反卷积网中利用卷积网中的相同的滤波器的转置应用到纠正过的特征图中,而不是上层的输出。也就是对滤波器进行水平方向和垂直方向的翻转。从高层向下投影使用转换变量switch,这个转化变量switch产生自向上的卷积网的最大池化操作。由于重建由一个单独的激活获得,因此也就只对应于原始输入图像的一小块。
**可视化结果:**下图显示了培训完成后模型的特征可视化。 可以发现通过CNN学习后,学习到的是具有辨别性的特征,比如要我们区分人脸和狗,那么通过CNN学习后,背景部位的激活度基本很少,我们通过可视化就可以看到我们提取到的特征忽视了背景,而是把关键的信息给提取出来了。Layer 1、Layer 2学习到的特征基本上是颜色、边缘等低层特征;Layer 3学习到的是纹理特征,比如上面的一些网格纹理;Layer 4学习到的则是比较有区别性的特征,比如狗;Layer 5学习到的则是具有辨别性关键特征。

ZF3

2.2 CNN的平移和缩放不变性
  不变性意味着即使目标的外观发生了某种变化,但是你依然可以把它识别出来。平移是一种几何变换,表示把一幅图像或一个空间中的每一个点在相同方向移动相同距离。比如对图像分类任务来说,图像中的目标不管被移动到图片的哪个位置,得到的结果(标签)应该是相同的,这就是卷积神经网络中的平移不变性。
为什么CNN具有平移不变性?

简单地说,卷积+最大池化约等于平移不变性。
**卷积:**图像经过平移,相应的特征图上的表达也是平移的。
**池化:**比如最大池化,它提取感受野中的最大值,如果最大值被移动了,但是仍然在这个感受野中,那么池化层也仍然会输出相同的最大值。
CNN层数越高不变性越强,但是不具有旋转不变性。

下图按行顺序分别为对5类图像进行不同程度的垂直方向上的平移、尺度变换、旋转对输出结果影响的分析图。a1为原始变换图像,a2是原始图片的欧氏距离,a3是经过7层变换后的图片的欧氏距离,a4是变换后图片被正确分类的概率图。

ZF4

2.3 可视化特征学习的过程

下图显示了,在网络训练过程中,每一层学习到的特征是怎么变化的,上面每一整张图片是网络的某一层特征图,然后每一列有8个小图片,分别表示网络epochs次数为:1、2、5、10、20、30、40、64的特征图:

ZF6

仔细看每一层,在迭代的过程中的变化,出现了sudden jumps;
从层与层之间做比较,我们可以看到,低层在训练的过程中基本没啥变化,比较容易收敛,高层的特征学习则变化很大。
从高层网络conv5的变化过程,我们可以看到,刚开始几次的迭代epochs,基本变化不是很大,但是到了40~50的迭代epochs的时候,变化很大。

ZF5

再上图中(a):经过裁剪的图片经过第一个卷积层后的特征可视化图。一个特征占主导地位。(b):AlexNet在卷积后的第一层特征。(c):ZFNet在卷积后的第一层特征。较小的步长(2 vs 4)和卷积核尺寸(7x7 vs 11x11)导致更多有效特征和更少的无效特征。(d):AlexNet在第二层卷积后特征的可视化。(e):ZFNet第二层卷积后特征的可视化。它们更干净,没有(d)中可见的混叠伪影。

2.4 卷积的工作原理

CNN到底是如何来学习图像特征的?如果给一张狗的照片,背景是家具,那么卷积是如何确定狗在图像中的位置的?ZFNet进行了消融实验:使用用灰色方块覆盖场景的不同部分

ZF7

上图使用了三个测试示例,a列是原始被遮盖的图像,b列是被灰色小方块掩盖后的网络结构中第五层的特征图,c列是把第五层的特征图(b)反卷积的可视化图像,我们可以看到每幅图像的特征区域。d列为正确分类概率的图,e列是分类的概率。

更进一步探究在深度模型中如何对同一类物体的不同图像进行一致性分析:
  对五张不同种类的小狗的图片的不同区域(依次遮挡住左眼,右眼,鼻子等)进行掩盖,然后进行分析观察探究深度模型是对一类物体的那部分进行一致性分析的过程:

ZF8

在5个不同的狗图像中的不同物体部分的对应性。眼睛和鼻子的得分较低 (与随机物体部分相比),这表明模型隐含地建立了某种形式的对应关系,在模型的第5层,各部分的对应关系。在第7层,这些分数更加相似,也许是由于上层试图区分不同品种的狗。
这表明底层判别的是一类物体共有的部分,而高层判别的是类别中不同的品种这种更高维的部分。

3、ZFNet的主要贡献

3.1 提出更深的网络结构

ZFNet在AlexNet的基础上增加了网络层次的深度,通过增加网络的层数来增加模型的表达能力。这种深度网络结构的引入对于提高图像分类性能起到关键作用,并为后续更深层次的模型设计奠定了基础。ZFNet采用了更小的卷积核和更大的卷积步长,以增加网络的感受野。通过使用更小的卷积核,网络可以更好地捕捉图像中的细节特征。而更大的卷积步长可以减少特征图的尺寸,从而进一步提高计算效率。较小的卷积核可以更好地捕捉图像中的细节信息,而深层网络可以提取更高级别的抽象特征。这种深度和细节的特征表示对于图像分类任务的性能至关重要。

3.2层叠池化操作

ZFnet中的层叠池化操作是一种特殊的池化策略,与传统的池化操作有所不同。层叠池化操作的主要目的是增加特征映射之间的信息交互,从而提高模型对图像特征的感知能力。在传统的卷积神经网络中,通常会使用池化层来减小特征映射的尺寸。池化操作通常使用一个固定大小的窗口(例如2x2或3x3)在特征映射上滑动,然后对窗口内的值进行汇总(例如最大池化或平均池化),以生成新的特征映射。这样的操作会减小特征映射的空间分辨率,有助于降低计算成本和提高模型的平移不变性。与传统池化不同,ZFnet采用了层叠池化操作,其中池化窗口的大小(PoolingSize)大于池化步长(stride)。这意味着池化窗口会重叠,覆盖了之前池化操作留下的部分。这种操作增加了特征映射之间的信息交互和重叠,有助于更好地捕获图像中的特征。通过层叠池化操作,相邻像素之间的信息交互得以增强,同时在不同尺度上保留了更多的细节信息。这有助于改善模型的感知能力,并提高其对不同尺度和层次的特征的提取能力。由于层叠池化操作会减小特征映射的尺寸,因此可以降低模型的参数数量和计算成本,从而减少过拟合的风险。

3.3 Dropout操作:

Dropout叫做随机失活,简单来说就是在模型训练阶段的前向传播过程中,让某些神经元的激活值以一定的概率停止工作,如下图所示,这样可以使模型的泛化性更强。ZFNet引入了Dropout操作,即随机失活。在模型训练的前向传播过程中,Dropout以一定的概率停止某些神经元的工作。这种操作可以提高模型的泛化能力,防止过拟合现象的发生。

img

​ Dropout操作会将概率小于0.5的每个隐层神经元的输出设为0,即去掉了一些神经节点,达到防止过拟合。那些“失活的”神经元不再进行前向传播并且不参与反向传播。这个技术减少了复杂的神经元之间的相互影响。在论文中,也验证了此方法的有效性。

3.4 特征可视化

使用反卷积、反池化、反激活函数去反可视化feature map ,通过feature map可以看出,特征分层次体系结构 ,以及我们可以知道前面的层学习的是物理轮廓、边缘、颜色、纹理等特征,后面的层学习的是和类别相关的抽象特征。这一个非常重要的结论,我们后面很多的微调手段都是基于此理论成果。

4.代码实现:

import torch.nn as nn
import torch 

# 与AlexNet有两处不同: 1. 第一次的卷积核变小,步幅减小。 2. 第3,4,5层的卷积核数量增加了。
class ZFNet(nn.Module):
    def __init__(self, num_classes=1000, init_weights=False):
        super(ZFNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 96, kernel_size=7, stride=2, padding=2),  # input[3, 224, 224]  output[96, 111, 111]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[96, 55, 55]

            nn.Conv2d(96, 256, kernel_size=5, padding=2),           # output[256, 55, 55]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[256, 27, 27]

            nn.Conv2d(256, 512, kernel_size=3, padding=1),          # output[512, 27, 27]
            nn.ReLU(inplace=True),

            nn.Conv2d(512, 1024, kernel_size=3, padding=1),          # output[1024, 27, 27]
            nn.ReLU(inplace=True),

            nn.Conv2d(1024, 512, kernel_size=3, padding=1),          # output[512, 27, 27]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[512, 13, 13]
        )
        self.classifier = nn.Sequential(
            nn.Dropout(p=0.5),
            nn.Linear(512 * 13 * 13, 4096),
            nn.ReLU(inplace=True),

            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            
            nn.Linear(4096, num_classes),
        )
        if init_weights:
            self._initialize_weights()

    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, start_dim=1)
        x = self.classifier(x)
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)

def zfnet(num_classes): 
    model = ZFNet(num_classes=num_classes)
    return model

5.总结

本周的学习重点是ZFNet,这是一个旨在提高AlexNet性能的模型。AlexNet是在大规模图像分类竞赛ImageNet中取得显著成就的卷积神经网络(CNN)的先驱。ZFNet引入了一种新颖的结构,特点是采用了更小的卷积核、更大的卷积步长和更多的深层网络层。这种设计旨在增强模型的特征表示能力。ZFNet在深度学习领域,尤其是在卷积神经网络的发展中,被视为一个重要的里程碑。通过在AlexNet的基础上进行改进,ZFNet推动了图像分类和特征学习能力的发展。它的成功不仅展示了深度学习模型在实际应用中的潜力,还为更复杂、更深层的神经网络的开发奠定了基础。最后以使用PyTorch进行ZFNet的实践操作结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值