Advertisement

VGGNet and Residual Network: Building Blocks of Modern

阅读量:

作者:禅与计算机程序设计艺术

1.简介

随着深度学习技术的快速发展, convolutional neural networks (CNNs) have gradually emerged as a cornerstone in fields like image recognition, segmentation, object detection, and video analysis. Despite their structural variations across different models, they all adhere to distinct principles and design philosophies. However, how to effectively integrate these models to achieve optimal performance remains an important research direction. This paper first traces the historical development of CNNs, highlighting their architecture progression from simple to complex. The VGGNet model, proposed by Fei-Fei et al., stands out for its extensive expansion of network depth, width, and height. Following its success came the ResNet model introduced by He et al., which introduced shortcut connections to enhance the network's expressiveness and significantly improved accuracy. Subsequently, this paper provides a detailed analysis of both models: it explores their unique characteristics, applicable scenarios, architectural features, training methodologies, and implementation codes. Finally, this paper outlines potential future research directions and provides references along with typical application cases. It is hoped that readers will find this material beneficial and further expand their understanding.

2.相关研究介绍

2.1 卷积神经网络的发展历史

2.1.1 LeNet-5

该卷积神经网络是LeNet-5架构,在1998年首次被Yann Lecun及其团队提出以解决手写数字识别问题。其设计主要包含七种卷积层和两种全连接层的结构,并采用sigmoid函数作为激活函数模块进行特征提取与分类处理后输出各类别对应的概率值

在神经网络模型中使用Sigmoid函数作为激活函数:其中,在较前的部分分别应用Sigmoid函数作为激活单元;而最后一层则使用Softmax函数构建分类器模块;这样的设计使得模型在求导运算和参数更新过程中更加便捷。

在本设计中,采用多类型卷积核以捕捉不同尺度的空间特征。通过使用1×1、3×3及5×5等不同尺寸的卷积核组合,在提升模型性能的同时实现了多层次的空间信息提取。

  1. 池化层:池化层用于降低维度,减少参数数量和计算量。

  2. 数据增广:训练时添加随机扰动,防止过拟合。

  3. 权重共享:每层使用的卷积核相同,可以有效减少参数数量。

2.1.2 AlexNet

AlexNet 在2012年被提出,相较于LeNet而言更为深层且架构更为复杂.该网络由多个卷积与全连接层构成,总计拥有6千万参数数量.如图所示的是AlexNet的主要架构

大规模并行计算:AlexNet将卷积层和全连接层分别部署在两块GPU上,并显著提升了运算效率。

ReLUs被广泛应用于神经网络中。
在AlexNet网络中采用ReLUs替代Sigmoid或Tanh函数作为激活单元。
该方法有效地缓解了梯度消失问题。

  1. Local Response Normalization (LRN):以抑制同一局部区域内神经元激活值之间的相互抵消现象,则 AlexNet在其卷积层 preceding结构中采用了该机制。

  2. Dropout:AlexNet 在全连接层之间加入 Dropout 以减轻过拟合。

  3. 数据增广:AlexNet 对输入数据进行图像增广,包括裁剪、旋转、缩放等操作。

  4. 参数初始化:AlexNet 中使用 Glorot 初始化方法初始化卷积核和偏置项。

  5. 插入窗口注意力机制(Inception module):该方案被AlexNet所采用,在提升网络性能方面表现出色。

2.1.3 VGGNet

在2014年,VGGNet被提出,它是基于VGG神经网络的发展而来。该网络通过将卷积层与池化层的堆叠方式替换成更为简洁的形式实现了对AlexNet的超越,展现出更深一层的深度和更高的复杂度。它的基本架构如图所示。

  1. 小卷积核:在 VGGNet 中,卷积核从 3x3 变为 3x3 的小卷积核,这有效地减少参数量。

  2. 深度可分离卷积:卷积层和池化层被分解成多个块,分别学习图像特征。

  3. 3 3 模块:引入 3 3 模块,增大感受野,并减少参数量。

通过使用全局平均池化层:VGGNet 将全连接层替换成这一策略实现 从而有效降低了网络的计算复杂度。

训练策略:VGGNet 采用了较小的学习率来初始化权重参数,在每次迭代中仅使用少量样本加快训练过程,并引入了Dropout层来缓解模型过拟合的问题。

2.1.4 GoogleNet

该网络结构于2014年首次提出旨在有效降低图像分类任务所需的计算负担。相较于其他图像分类网络,在效率方面表现出色并获得了良好的效果。其主要创新点如下:

架构简洁且深度较浅:该神经网络仅包含22层,并且其深度较低。因此整个网络架构更加简洁易懂。

分层架构:由多个并行运行的子架构组成,并按照需求进行叠加。每个子架构分别负责图像的不同区域,并通过跳跃连接整合所有子架构的输出结果。

Inception模块:通过不同的组合方式构建独立的分支网络,并结合不同尺寸的卷积核、池化操作及步长设置,在多个尺度上提取空间特征信息。

采用标准化技术,在各卷积层后加入归一化层以达成正则化目的,并使梯度运行稳定

2.1.5 ResNet

ResNet 是由 Facebook 团队提出的一种深度神经网络,在计算机视觉领域具有重要地位。该模型通过短路连接机制(即 skip connection),使得 ResNet 在某些层能够继承并整合来自上一层的信息以生成新的特征表示。其主要特点包括:一是通过残差块的构建实现了梯度在深层网络中的有效传播;二是借助跳跃连接增强了模型对复杂特征学习的能力。

跨层级联结构:ResNet 在一些层级中实现了跨层级联(skip connection),即通过将前一层次的输出作为当前层次输入的一部分。

  1. 层宽限制:ResNet 中,所有层的通道数都是一致的。

2.1.6 其它模型

除了现有的那些模型之外,在卷积神经网络领域中还有其他类型的网络架构也存在一定的局限性

2.2 VGGNet 介绍

2.2.1 VGGNet 简介

作为2014年ILSVRC冠军奖得主Simonyan及其团队开展的一项开创性实验,VGGNet以其简洁明了的架构在ImageNet数据集上取得了突破性进展。当推出时,该模型成为当时深度神经网络领域的最快模型,因为它不仅架构简单,而且在实际应用中展现了卓越的性能。值得注意的是,该网络的名字源于所使用的三种不同尺寸的最大卷积核(分别为1×1、3×3和5×5)。本文将深入探讨VGGNet的设计原理,并演示如何利用Keras工具实现对它的训练、测试以及性能评估。

2.2.2 VGGNet 结构

VGGNet是一种深度卷积神经网络,并主要由多个功能模块构成包括卷积模块池化模块和全连接模块其中第一部分包含多个卷积层逐步提取图像特征整个网络的主要特点在于其丰富的特征提取能力

2.2.2.1 VGGBlock

VGGBlock 可以被视作 VGGNet 的核心模块,在结构上由两个卷积层和一个最大池化层组成,并采用了步长为2的池化操作。以下展示了一个典型 VGGBlock 构造图:

复制代码
    from keras.layers import Conv2D, MaxPooling2D
    
    def vgg_block(inputs, filters):
    x = Conv2D(filters, kernel_size=3, activation='relu', padding='same')(inputs)
    x = Conv2D(filters, kernel_size=3, activation='relu', padding='same')(x)
    x = MaxPooling2D()(x)
    return x
    
      
      
      
      
      
      
    
    代码解读

其中使用的是卷积层结构(Conv2D),涉及的是池化层结构(MaxPooling2D),激活函数设置为 ReLU(activation='relu')。边界填充采用相同模式处理(padding='same'),其作用是保证图像的比例不受影响,并通过将输入图像调整至与卷积核尺寸一致后补充空缺区域来实现边界填充效果。

2.2.2.2 VGGNet 的主体结构

下面介绍的是 VGGNet 的主体结构,共计八个 VGGBlock 组成。

复制代码
    def build_model():
    inputs = Input((img_height, img_width, 3))
    
    # block 1
    x = vgg_block(inputs, 64)
    
    # block 2
    x = vgg_block(x, 128)
    
    # block 3
    x = vgg_block(x, 256)
    for i in range(2):
        x = vgg_block(x, 256)
    
    # block 4
    x = vgg_block(x, 512)
    for i in range(2):
        x = vgg_block(x, 512)
    
    # block 5
    x = vgg_block(x, 512)
    for i in range(2):
        x = vgg_block(x, 512)
    
    # output layer
    outputs = Dense(num_classes, activation='softmax')(x)
    
    model = Model(inputs=[inputs], outputs=[outputs])
    return model
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

其中 Input() 为输入层,Dense() 为输出层,Model() 是创建模型的类。

2.2.2.3 输入输出张量

VGGNet 的输入层遵循格式 (batch\_size, height, width, channels);其中 batch_size 值通常设定为 32;channels 表示输入的通道数,在 RGB 图像中通常设置为 3;高度和宽度分别代表图片的高度和宽度;输出层的大小遵循格式 $(batch_size, num_classes);其中 num_classes 指的是分类的数量

2.2.3 VGGNet 的优点和缺点

2.2.3.1 优点
  • VGGNet 拥有较强的通用性,并且其模型参数数量较少、运算规模较小以及操作简便。
  • 研究者观察到该网络能够有效提取图像整体特征的能力较强,并且在识别小型物体时表现出色,在处理大型物体时则相对精度有所下降。
  • 该模型采用了多层次分阶的设计理念,在结构上更为紧凑,并且在实际应用中展现出较高的训练效率和优秀的收敛效果。
  • 研究者的主要创新在于借鉴子网络概念,并通过逐层构建的方式实现了较为复杂的图像分类任务目标。
2.2.3.2 缺点
  • 该网络在训练过程中对时间和内存资源有较高的需求,并且对较大的数据集有较高的要求。
  • 该网络的训练效率较低的主要原因是其采用的小尺寸卷积核。
  • 该网络仅限于处理规模较小的图像分类任务。

2.2.4 用 Keras 训练、测试和评估 VGGNet

为了在Keras中训练、验证以及评估VGGNet模型, 我们可以编写相应的代码实现. 假设输入图像尺寸设置为224像素×224像素, 训练数据集规模设定为1万张图片, 分类数目设定为10个类别. 如需更换自己的数据集, 可以调整相关参数.

复制代码
    import numpy as np

    from tensorflow.keras.applications import VGG16
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Flatten
    from sklearn.metrics import classification_report
    
    
        
        
        
        
        
        
    代码解读

define the input shape

input_shape = (224, 224, 3)

load data generator with data augmentation

datagen is created by an instance of ImageDataGenerator with rescaling factor 1/255 applied, along with shear ratio set to 0.2, zoom level adjusted to 0.2, and horizontal flip option enabled

train_generator = datagen.generate('path/to/train/dir', with target image size (224x224), batch size of 32, class mode set to categorical class mode)

validation_generator = datagen.generate_from(
validation_folder_path,
target_dimension=(224×224),
batch_size_of_32,
classification_mode=categorical
)

test_generator变量被赋值为datagen生成器从指定路径中生成测试数据的代码行。该生成器将按照设定的目标尺寸(即每边长为224像素)处理批次大小为32的数据,并设置类别模式为categorical类型。

create a pre-trained VGG16 model with weights trained on imagenet

基础模型参数配置如下:使用VGG16架构,默认预训练权重基于Imagenet数据集;不包含顶层层;输入形状设置为input_shape。

for layer in base_model.layers[:15]: layer.trainable = False

该模型采用顺序模型架构,并依次接入各层神经网络结构。
首先初始化一个基础模型模块。
随后应用平面化层以降维处理数据特征。
接着设置全连接层并引入1024个神经元和ReLU激活函数。
随后施加50%的Dropout正则化以防止过拟合。
最后引入具有10个输出节点的全连接层并应用Softmax激活函数以实现分类目标。

compile the model with optimizer and loss function

该模型采用Adam优化器,并基于交叉熵损失函数进行训练与评估。

train the model

history 等于 model 的 fit 函数调用结果

evaluate the model on test set

test_loss, test_acc = model.evaluate(test_generator, verbose=0)

print('Test accuracy:', test_acc)

make predictions on new images

test_images, test_labels = 抽取一个批次的测试数据集迭代器
predictions = model推断test_images

compute classification report

创建target_names变量为一个包含从0到9编号的字符串列表。
计算分类报告并将其赋值给classification变量。

print(classification) ```

全部评论 (0)

还没有任何评论哟~