17_VGG深度学习图像分类算法

news2024/10/6 3:38:49

1.1 简介

VGG网络,全称为Visual Geometry Group网络,是由牛津大学的Visual Geometry Group和谷歌DeepMind的研究人员共同提出的深度卷积神经网络模型。这一模型因在2014年ILSVRC(ImageNet大规模视觉识别挑战赛)中取得图像分类任务第二名和定位任务第一名的佳绩而声名鹊起,展示了深度在卷积神经网络设计中的重要性。

VGG网络的核心设计理念在于使用多个连续的3x3卷积核来替代较大的卷积核(如5x5或7x7),这样的设计不仅保持了感受野的大小,还有效增加了网络的深度,使得模型能够学习到更加复杂的图像特征。VGG模型有两个常见的变体:VGG16和VGG19,分别包含16层和19层的可学习参数层(不包括池化层和激活函数层),这些层由多个卷积层和三个全连接层组成。

具体来说,VGG16网络结构包含13个卷积层和3个全连接层,而VGG19则在此基础上增加了几个卷积层。这些网络通常接受224x224像素、三通道(RGB)的输入图像,并通过一系列的3x3卷积操作和2x2的最大池化操作逐步降低空间维度,直至最后的全连接层输出1000维向量,对应于ImageNet数据集上的1000个类别。最终,通过Softmax函数转换这些输出为概率分布,以进行分类预测。

VGG网络的出现推动了深度学习领域对网络深度的探索,其简洁而有效的架构原则对后续的深度学习模型设计产生了深远的影响,成为了众多计算机视觉任务的基础模型之一。尽管随着技术的发展,出现了更为高效和高性能的网络(如ResNet、Inception等),但VGG依然是学习卷积神经网络基础和原理的经典案例。

VGG模型提出于论文《Very Deep Convolutional Networks for Large-Scale Visual Recognition》,下面我们就来学习一下这篇论文。

1.2 VGG16和VGG19

VGG16和VGG19是VGG网络的两个著名变体,它们都是由一系列卷积层、最大池化层、以及最后的几个全连接层组成。这两个模型的设计重点在于增加网络的深度,以提高对图像特征的学习能力。下面是VGG16和VGG19的具体构成细节:

VGG16 

VGG16模型包含16个可训练的权重层,其中包括13个卷积层(Convolutional Layers)和3个全连接层(Fully Connected Layers,或称 Dense Layers)。其具体结构如下:

  1. 输入层:接收224x224像素的RGB图像。
  2. 卷积块:VGG16由五个卷积块组成,每个块后跟着一个最大池化层(Max Pooling Layer)。
    • 第一个块包含2个连续的3x3卷积层,步长为1,填充为1(SAME padding)。
    • 接下来的四个块各包含3个连续的3x3卷积层。
    • 每个卷积层后都使用ReLU作为激活函数。
    • 每个卷积块之后是一个2x2、步长为2的最大池化层,用于减少空间维度。
  3. 全连接层
    • 第一个全连接层有4096个神经元。
    • 第二个全连接层同样有4096个神经元。
    • 最后一个全连接层有1000个神经元,对应于ImageNet数据集中的1000个分类标签。
  4. 输出层:使用Softmax函数,将前一层的输出转化为各个类别的概率分布。

VGG19 

VGG19相比VGG16,主要区别在于它拥有更多的卷积层,总计19个可训练的权重层,包括16个卷积层和3个全连接层。VGG19的结构与VGG16非常相似,只是在某些卷积块中添加了额外的卷积层,以进一步提升模型的表达能力。

  • VGG19的卷积块中,除了第一个块包含2个卷积层外,其余四个块各自包含了4个连续的3x3卷积层,而不是VGG16中的3个,这使得VGG19的深度增加。
  • 其余部分,包括最大池化层、全连接层和输出层的配置与VGG16相同。

虽然VGG19比VGG16更深,理论上能学习到更复杂的特征,但这也意味着计算成本和内存消耗更高。在实际应用中,VGG16由于其相对较低的复杂度和较高的性能,常常被用作基准模型或者预训练模型。两者均以其清晰的结构设计和良好的图像识别性能,在深度学习研究和实践中占据重要地位。不过,随着计算资源的进步,更多关注效率的模型(如ResNet系列)在许多场景下已经取代了VGG作为首选模型。

下图为VGG16的模型解释:

VGG16的参数和内存占用情况 

前两层的卷积占据了绝大部分的内存,第一层的全连接层占据了绝大部分参数。

1.3 为什么VGG全部使用3x3卷积

VGG网络选择全部使用3x3卷积核的原因主要有以下几点:

  1. 细粒度特征提取:3x3是能够捕捉到像素八邻域信息的最小尺寸卷积核。这意味着它可以在保留局部空间信息的同时,有效地提取图像中的细节特征。

  2. 等效感受野与更深层网络:通过堆叠多个3x3卷积层,VGG网络能够以较小的计算成本达到与较大卷积核(如5x5或7x7)相同的有效感受野。例如,两个3x3卷积层堆叠起来,其感受野相当于一个5x5的卷积核,而三个堆叠起来则接近于7x7的感受野。这种设计使网络能够学习到更深层次的抽象特征,而不会显著增加计算负担。

  3. 计算效率:相比于更大的卷积核,使用多个连续的3x3卷积核在计算上更加高效。例如,一个5x5卷积核的操作量相当于两个3x3卷积核操作量的和减去一个中间层的激活函数操作,总体上减少了参数数量和计算量。

  4. 模型深度的增加:VGG网络的设计哲学是通过增加网络的深度而非宽度来提高性能。3x3卷积核的小尺寸允许网络设计者轻松地堆叠更多层,进而探索更深的网络结构,这对于提升模型对复杂图像特征的学习能力至关重要。

  5. ReLU激活函数的配合:VGG网络每一层卷积之后都使用ReLU激活函数,这有助于缓解梯度消失问题,使网络能够更有效地训练更深的结构。

综上所述,VGG网络全部采用3x3卷积核的设计是出于对特征提取效率、模型复杂度控制、以及深度增加潜力的综合考量,这一策略在当时推动了深度学习领域对网络深度探索的浪潮。

1.4 VGG模型的特点

VGG网络的优点:

  1. 结构简洁统一:VGG网络结构设计简洁,主要由重复的卷积层和最大池化层构成,易于理解和实现。
  2. 深度加深提升性能:VGG通过增加网络深度,验证了更深的网络结构能够显著提升模型的识别精度。
  3. 小卷积核高效特征提取:使用多个3x3的小卷积核代替大卷积核,既减少了参数量,又能保持较大的感受野,有效提取图像特征,同时保持了计算效率。
  4. 感受野与参数量平衡:通过堆叠小卷积核,VGG在不增加太多参数的情况下,扩大了感受野,有利于捕获更复杂的图像特征。
  5. ReLU激活函数的使用:所有卷积层之后使用ReLU激活函数,有助于加速模型训练并缓解梯度消失问题。

VGG网络的缺点:

  1. 计算资源消耗大:VGG网络由于其深度和大量的参数,特别是全连接层中的参数,导致模型在计算资源和内存占用上要求较高。
  2. 训练时间长:由于模型的复杂性和参数量,VGG网络的训练过程可能比较漫长,特别是在硬件资源有限的情况下。
  3. 参数量过多:尽管小卷积核减少了参数,但整个模型的参数总量仍然很大,不利于在资源受限环境(如移动设备)上的部署。
  4. 过拟合风险:尽管深度增加提升了模型的表达能力,但也增加了过拟合的风险,需要更多的数据或正则化手段来缓解。
  5. 优化难度:较深的网络结构可能导致梯度传播问题,如梯度消失或爆炸,需要精心设计的初始化和学习率策略。

总的来说,VGG网络通过加深网络结构在图像识别任务上取得了显著成效,但其较大的计算需求和参数量限制了在特定场景下的应用,促使后来的研究者发展出更多计算高效且性能强大的网络结构,如残差网络(ResNet)和移动网络(MobileNet)等。

1.5 感受野的作用

感受野是指网络中某一层输出特征图(Feature Map)上的每一个像素点,追溯到输入图像时所覆盖或“感受”到的输入图像区域大小。换句话说,它描述了网络中一个特定神经元的响应与输入数据之间空间上的关联范围。随着网络层次的加深,通过卷积层和池化层的操作,每一层神经元的感受野通常会逐渐扩大,这意味着更高层的神经元能够捕捉到更广阔范围的输入特征,从而学习到更加抽象和全局的图像特征。理解感受野对于设计网络结构、控制模型复杂度以及优化模型性能具有重要意义。

感受野(Receptive Field)在深度学习,尤其是卷积神经网络(CNN)中,扮演着核心角色,其作用主要体现在以下几个方面:

  1. 特征层次理解:感受野定义了网络中某一层神经元对其输入数据的依赖区域大小。随着网络深度的增加,高层神经元的感受野通常会逐渐扩大,这使得它们能够捕捉到输入数据更广泛的空间上下文信息。因此,感受野帮助网络从底层的局部特征逐步过渡到高层的全局或抽象特征。

  2. 信息整合:通过调整卷积核大小、步长、填充等超参数,感受野的大小直接影响了网络如何整合局部信息。较大的感受野能够汇总更大范围的特征,有助于识别需要大范围上下文理解的任务,如物体识别中的目标位置和姿态估计。

  3. 模型设计指导:了解感受野的工作原理对于网络架构设计至关重要。例如,VGG网络通过堆叠多个小卷积核来替代大卷积核,既控制了参数量,又有效扩大了高层特征的感受野,这是基于对感受野原理的深刻理解。

  4. 性能优化:合理设置感受野可以帮助减少计算量和内存占用,同时维持或提升模型性能。例如,在目标检测或语义分割任务中,感受野大小直接影响到模型对目标细节的捕捉能力,以及对整体场景的理解能力。

  5. 解决过拟合:感受野的布局和大小还与模型的泛化能力相关。通过控制感受野,可以在一定程度上避免模型过度关注输入数据中的噪声或无关细节,从而有助于减轻过拟合现象。

  6. 视觉解释:感受野的概念有助于我们直观理解CNN如何逐步构建对输入图像的理解,这对于模型的可视化解释和可解释性研究至关重要。

1.6 迁移学习

迁移学习(Transfer Learning)是一种机器学习方法,其核心思想是利用在一个任务或领域上学到的知识来帮助完成另一个相关但不同的任务或领域的学习。这种方法基于这样一种观察:从一个大型数据集中学到的特征往往对其他相关任务也是有用的,即使这些任务的数据可能较少。

迁移学习的主要优势包括:

  1. 减少训练时间和计算资源:在许多情况下,预训练模型已经学习到了丰富的特征表示,新任务可以通过微调这些模型来显著加快训练速度,而不是从头开始训练。

  2. 提高模型性能:尤其是在数据稀缺的新任务中,使用迁移学习可以避免从零开始训练模型可能遇到的过拟合问题,从而提高模型的泛化能力。

  3. 降低标注成本:对于需要大量标注数据的任务,迁移学习可以通过利用已有的预训练模型来减少对新数据集的标注需求。

迁移学习的常见形式有几种:

  • 特征提取:使用预训练模型的前几层作为固定的特征提取器,只训练模型的顶层或新增的部分层以适应新的任务。

  • 微调(Fine-tuning):在预训练模型的基础上,对整个模型或部分层进行进一步训练,同时使用新任务的数据,这样可以在保留原有知识的同时,让模型适应新任务的特性。

  • 多任务学习:在同一个网络中同时训练多个相关任务,共享一部分表示层,使得各个任务之间可以相互促进学习。

  • 域适应:当源任务和目标任务来自不同但相关的域时,迁移学习还包括减少域间差异,使模型能够在新域中更好地泛化。

如下图:对于VGG的迁移学习,我们只需要在最后一层换成我们需要的分类个数就可以,保持之前所有层的模型结构不变,权重也不变(冻结住)。我们就可以把我们在imageNet预训练好的模型用于解决我这个类别的分类问题。

2. pytorch复现

# Author:SiZhen
# Create: 2024/7/7
# Description: pytorch搭建VGG16网络模型
import torch
import torch.nn as nn
from torch.nn import  functional as F

class VGG16(nn.Module):
    def __init__(self,input_size):
        super(VGG16, self).__init__()
        #定义网络结构
        #block 1
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=3,out_channels=64,kernel_size=3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(in_channels=64,out_channels=64,kernel_size=3,padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(64,128,3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(128,128,3,padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2)
        )
        self.conv3 = nn.Sequential(
            nn.Conv2d(128,256,3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256,256,3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256,256,3,padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2)
        )
        self.conv4 = nn.Sequential(
            nn.Conv2d(256,512,3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,512,3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,512,3,padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2)
        )
        self.conv5 = nn.Sequential(
            nn.Conv2d(512,512,3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,512,3,padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,512,3,padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2)
        )
        self.fc1 = nn.Linear(7*7*512,4096)
        self.fc2 = nn.Linear(4096,4096)
        self.fc3 = nn.Linear(4096,1000)

    def forward(self,x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.conv5(x)

        x = x.view(-1,7*7*512) #铺平
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.fc3(x)
        output = F.softmax(x,dim=1)




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1904214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思25天学习打卡营第4天|MindSpore数据集和数据变换

# 打卡 目录 # 打卡 Dateset:Pipeline 的起始 具体步骤 数据处理 Pipeline 代码例子 内置数据集的情况 自定义数据集的情况 可迭代的数据集 生成器 Transforms:数据预处理 代码例子 通用变换Compose 文本变换 Text Lambda变换 Dateset&…

STM32芯片系列与产品后缀解读

一. 产品系列 STM32单片机是一系列基于ARM Cortex-M内核的32位微控制器,广泛应用于嵌入式系统中。 STM32系列由STMicroelectronics(意法半导体)开发和生产,并凭借其灵活的设计、丰富的外设和强大的生态系统,成为嵌入式…

JVM专题之G1垃圾收集器下

索引(记录)的源码的工作流程图如下: CSet(Collection Set 回收集合) 收集集合(CSet)代表每次GC暂停时回收的一系列目标分区。在任意一次收集暂停中,CSet所有分区都会被释放,内部存活的对象都会被转移到分配的空闲分区中。因此无论是年轻代收集,还是混合收集,工作的机…

catia数控加工仿真铣平面粗加工

1,零件建模,毛坯建模 2 在毛坯上建立坐标系 3 添加资料刀具 4,双击对相关加工信息做设置 5 Roughing 加工设置 高亮红色区域是必选的,其他可以默认 6 完成加工仿真 7 加工余量

IntelliJ IDEA 同时多行同时编辑操作快捷键

首先 点击要编辑的地方,长按鼠标左键不放,同时按住 Ctrl Shift Alt,然后就可以进行多行编辑了

亲密数对C++函数

自定义函数 #include<bits/stdc.h> using namespace std; //求n的因子和自定义函数 int yinzihe(int n){//使用2~sqrt(n)成对求解因子和int r0,i;//变量 r 初始值为0&#xff0c;因为要存放因子和for(i2;i<sqrt(n);i) {//回顾sqrt()课程//如果 i 是 n 的因子&#xf…

用win的控制台去远程连接虚拟机linux的终端

以Ubuntu为例&#xff0c;首先确保Ubuntu已经安装了ssh服务 sudo apt-get install openssh-server输入密码 安装完毕后查看ssh状态是否开启 sudo systemctl status ssh 显示绿色激活状态&#xff0c;可以关闭或开启 对应start和stop winr打开win端控制台 输入 ssh -p 22 …

【Linux详解】进程等待 | 非阻塞轮询

引入&#xff1a; 为什么&#xff1f;是什么&#xff1f;怎么办 是什么&#xff1f; 进程等待是指父进程暂停自己的执行&#xff0c;直到某个特定的子进程结束或发生某些特定的事件。 为什么&#xff1f; 僵尸进程刀枪不入&#xff0c;不可被杀死&#xff0c;存在内存泄露…

Codeforces Round 918 (Div. 4)(A~F)

目录 A. Odd One Out B. Not Quite Latin Square C. Can I Square? D. Unnatural Language Processing E. Romantic Glasses F. Greetings A. Odd One Out Problem - A - Codeforces 输出一个不同于其他两个数的数&#xff0c;用异或操作可以轻松解决。 void solve{int…

ompl.app的demo_OpenDEPlanning例子

编译了下OMPL和OMPL.app, 其中有个example 是用刚体动力学库ODE搭建的小车运动场景&#xff0c;找出小车到目标的路径&#xff0c;牵引小车跑到目标位置。 ompl小车路径运动模拟

https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件

文章目录 前言https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件1, 检查openssl的版本2. 生成私钥和证书签署请求 (CSR)3. 生成自签名证书4. 将证书和私钥转换为 PKCS12 格式的密钥库5. 创建信任库 (Truststore)6. 将 PKCS12 文件转换为 JKS 文件7.…

详解Python递归解决汉诺塔问题

Python递归解决汉诺塔问题 递归解决汉诺塔问题是经典的计算机科学问题&#xff0c;它涉及到如何将一堆盘子从一个柱子上移动到另一个柱子上&#xff0c;每次只能移动一个盘子&#xff0c;并且大盘子不能放在小盘子上面。 例如我们需要将a柱盘子全部移动到b柱&#xff0c;接下来…

程序员熬夜看欧洲杯被“冻住”,呼吸困难……

2024欧洲杯接近尾声&#xff0c;更是激发球迷兴趣。由于时差关系&#xff0c;很多球迷熬夜看球&#xff0c;啤酒、宵夜成了标配。然而&#xff0c;在这份欢乐背后&#xff0c;也隐藏着健康风险。 日前&#xff0c;浙江杭州29岁的程序员单先生熬夜与朋友看完球赛后开车回家&…

室内定位可视化:精准导航与实时位置展示

通过图扑室内定位可视化技术&#xff0c;提供精准的导航服务和实时位置展示&#xff0c;帮助用户高效找到目标地点&#xff0c;提升空间管理和资源配置的效率与体验。

Spring学习05-[AOP学习-AOP原理和事务]

AOP原理和事务 AOPAOP底层原理比如下面的代码案例手动模拟AOP 动态代理详解JDK动态代理 AOP AOP底层原理 当实现了AOP,Spring会根据当前的bean创建动态代理(运行时生成一个代理类) 面试题&#xff1a;为什么执行方法的时候&#xff0c;会执行切面里的通知方法&#xff1f; 比…

51单片机嵌入式开发:1、STC89C52环境配置到点亮LED

STC89C52环境配置到点亮LED 1 环境配置1.1 硬件环境1.2 编译环境1.3 烧录环境 2 工程配置2.1 工程框架2.2 工程创建2.3 参数配置 3 点亮一个LED3.1 原理图解读3.2 代码配置3.3 演示 4 总结 1 环境配置 1.1 硬件环境 硬件环境采用“华晴电子”的MINIEL-89C开发板&#xff0c;这…

YOLOv8 | 代码逐行解析(五) | YOLOv8中损失函数计算的详解包含Cls和Bbox计算的解析,小白必看(下)

一、本文介绍 本文给大家带来的是YOLOv8中的损失函数计算的完整解析&#xff0c;内容包括v8DetectionLoss的解析&#xff0c;以及BboxLoss的解析&#xff0c;如果你相对损失函数的计算原理&#xff0c;本文内容绝对会对你有所帮助&#xff0c;全文内容包含1万两千字&#xff0…

【鸿蒙学习笔记】MVVM模式

官方文档&#xff1a;MVVM模式 [Q&A] 什么是MVVM ArkUI采取MVVM Model View ViewModel模式。 Model层&#xff1a;存储数据和相关逻辑的模型。View层&#xff1a;在ArkUI中通常是Component装饰组件渲染的UI。ViewModel层&#xff1a;在ArkUI中&#xff0c;ViewModel是…

四大常见的排序算法JAVA

1. 冒泡排序 相邻的元素两两比较&#xff0c;大的放右边&#xff0c;小的放左边 第一轮比较完毕之后&#xff0c;最大值就已经确定&#xff0c;第二轮可以少循环一次&#xff0c;后面以此类推 如果数组中有n个数据&#xff0c;总共我们只要执行n-1轮的代码就可以 package Bu…

转盘输入法-键盘加鼠标版本

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 键盘加鼠标版本GIF演示 演示软件下载 转盘输入法PC演示版本EXE下载https://download.csdn…