基于卷积的图像分类识别(三):VGGNet

news2024/9/20 18:26:24

系列文章目录

本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,MobileNet,ShuffleNet,EifficientNet,Vision Transformer,Swin Transformer,Visual Attention Network,ConvNeXt, MLP-Mixer,As-MLP,ConvMixer,MetaFormer


VGGNet 文章目录

  • 系列文章目录
  • 前言
  • 一、Vgg网络模型
  • 二、网络贡献总结
    • 1、结构简洁
    • 2、小卷积核
    • 3、小池化核
    • 4、通道数多
    • 5、层数更深、特征图更多
  • 三、 代码实现
  • 总结


前言

2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员Karen Simonyan和Andrew Zisserman研发出了新的深度卷积神经网络:VGGNet,并在ILSVRC2014比赛分类项目中取得了第二名的好成绩(第一名是同年提出的GoogLeNet模型),同时在定位项目中获得第一名。

VGGNet模型通过探索卷积神经网络的深度与性能之间的关系,成功构建了16~19层深的卷积神经网络,并证明了增加网络深度可以在一定程度上提高网络性能,大幅降低错误率。此外,VGGNet具有很强的拓展性和泛化性,适用于其他类型的图像数据。至今,VGGNet仍然被广泛应用于图像特征提取。

VGGNet可以看成是加深版本的AlexNet,都是由卷积层、全连接层两大部分构成。


论文名称:Very deep convolutional networks for large-scale image recognition
论文下载链接:https://arxiv.org/pdf/1409.1556.pdf%E3%80%82
pytorch代码实现:https://github.com/Arwin-Yu/Deep-Learning-Classification-Models-Based-CNN-or-Attention

一、Vgg网络模型

dropout

如上图所示是经典的Vgg16网络模型:

  • 模型接收的输入是彩色图像,数据存储的形状为(B, C, H, W) 分别代表(图像数量,图片色彩通道,图片高度,图片宽度)以上图实例中为(1,3,224,224)
  • 模型的特征提取阶段是不断重复堆叠卷积层和池化层实现的,一共经过5次下采样(图中红颜色的层结构),下采样方式为最大池化。注意:通过调整步长(strdie)和填充(padding),网络中的所有卷积操作都没有改变输入特征图的尺寸。
  • 在最后的顶层设计中,经过三个全连接层实现对图片的分类操作。注意:由于全连接层的存在, 网络只能接收固定大小的图像尺寸。

二、网络贡献总结

1、结构简洁

VGG模型中,所有卷积层的卷积核大小,步长和填充都相同,并且通过使用最大化池对卷积层进行分层。所有隐藏层的激活单元都采用ReLU函数。在最后的顶层设计中,通过三层全连接层和Softmax输出层实现对图像的分类操作。由于其极简且清晰的结构,直到今天VGG也依然被很多工作用于图像的特征提取器,正所谓:大道至简

2、小卷积核

VGGNet中所有的卷积层都使用了小卷积核(3×3)。这种设计有两个优点:一方面,可以大幅减少参数量;另一方面,节省下来的参数可以用于堆叠更多的卷积层,进一步增加了网络的深度和非线性映射能力,从而提高了网络的表达和特征提取能力。

小卷积核是VGG的一个重要特点,虽然VGG是在模仿AlexNet的网络结构,但并没有采用AlexNet中比较大的卷积核尺寸(如7×7),而是通过降低卷积核的大小(3×3),增加卷积子层数来达到同样的性能。

VGG模型中,指出两个3×3的卷积堆叠获得的感受野大小,相当于一个5×5的卷积;而3个3×3卷积的堆叠获取到的感受野相当于一个7×7的卷积。这样可以增加非线性映射,也能很好地减少参数(例如7×7的参数为49个,而3个3×3的参数为27)。

卷积计算结果尺寸(卷积后特征图的size)的计算方式如下。
输入的特征图尺寸为 i \mathrm{i} i, 卷积核的尺寸为 k k k, 步长 (Stride) 为 s s s, 填充 (Padding) 为 p p p, 则输出的特 征图的尺寸 O O O 为。
o = ⌊ i + 2 p − k 2 ⌋ + 1 o=\left\lfloor\frac{i+2 p-k}{2}\right\rfloor+1 o=2i+2pk+1
假设特征图是 28 × 28 28 \times 28 28×28 的, 假设卷记的步长step = 1 =1 =1, padding = 0 =0 =0

  1. 使用一层 5 × 5 5 \times 5 5×5 卷积核, 由 ( 28 − 5 ) / 1 + 1 = 24 (28-5) / 1+1=24 (285)/1+1=24 可得, 输出的特征图尺寸为 24 × 24 24 \times 24 24×24
  2. 使用两层 3 × 3 3 \times 3 3×3 卷积核。
  1. 第一层, 由 ( 28 − 3 ) / 1 + 1 = 26 (28-3) / 1+1=26 (283)/1+1=26 可得, 输出的特征图尺寸为 26 × 26 26 \times 26 26×26
  2. 第二层, 由 ( 26 − 3 ) / 1 + 1 = 24 (26-3) / 1+1=24 (263)/1+1=24 可得, 输出的特征图尺寸为 24 × 24 24 \times 24 24×24
    可以看到最终结果两者相同, 即两个 3 × 3 3 \times 3 3×3 的卷积堆叠获得的感受野大小, 相当于一个 5 × 5 5 \times 5 5×5 的卷积。

3、小池化核

相比AlexNet的3x3的池化核,VGG全部采用2x2的池化核。

4、通道数多

VGG网络第一层的通道数为64,后面每层都进行了翻倍,最多到512个通道。相比较于AlexNet和ZFNet最多得到的通道数是256,VGG 的通道数的进行了翻倍,使得更多的信息可以被卷积操作提取出来。

5、层数更深、特征图更多

网络中,卷积层专注于扩大feature maps的通道数、池化层专注于缩小feature maps的宽和高,使得模型架构上更深更宽的同时,控制了计算量的增加规模。


三、 代码实现

这里给出模型搭建的python代码(基于pytorch实现)。完整的代码是基于图像分类问题的(包括训练和推理脚本,自定义层等)详见我的GitHub:完整代码链接

import torch.nn as nn
import torch
 
class VGG(nn.Module):
    def __init__(self, features, num_classes=1000, init_weights=False):
        super(VGG, self).__init__()
        self.features = features
        self.classifier = nn.Sequential(
            nn.Linear(512*7*7, 4096),
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(p=0.5),
            nn.Linear(4096, num_classes)
        )
        if init_weights:
            self._initialize_weights()

    def forward(self, x):
        # N x 3 x 224 x 224
        x = self.features(x)
        # N x 512 x 7 x 7
        x = torch.flatten(x, start_dim=1)
        # N x 512*7*7
        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')
                nn.init.xavier_uniform_(m.weight)
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.xavier_uniform_(m.weight)
                # nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)


def make_features(cfg: list):
    layers = []
    in_channels = 3
    for v in cfg:
        if v == "M":
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
            layers += [conv2d, nn.ReLU(True)]
            in_channels = v
    return nn.Sequential(*layers)

# vgg_tiny(VGG11), vgg_small(VGG13), vgg(VGG16), vgg_big(VGG19)
cfgs = {
    'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],   
    'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
    'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}


def vgg11(num_classes): 
    cfg = cfgs["vgg11"]
    model = VGG(make_features(cfg), num_classes=num_classes)
    return model

def vgg13(num_classes):  
    cfg = cfgs["vgg13"]
    model = VGG(make_features(cfg), num_classes=num_classes)
    return model

def vgg16(num_classes):  
    cfg = cfgs["vgg16"]
    model = VGG(make_features(cfg), num_classes=num_classes)
    return model

def vgg19(num_classes):  
    cfg = cfgs['vgg19']
    model = VGG(make_features(cfg), num_classes=num_classes)
    return model
    
 

总结

VGG是于2014年提出的经典卷积神经网络模型。VGG网络结构简单而规整,由一系列重复的卷积块(Conv Block)和池化块(Pool Block)构成。每个卷积块包含若干个卷积层和激活函数,每个池化块则包含一个池化层。所有的卷积层和池化层都使用相同的卷积核尺寸和步长,从而使得网络结构规整。

此外,VGGNet采用了较小的卷积核尺寸(通常为3×3),这样可以减少模型参数数量,并且通过堆叠多层卷积层来增加模型的深度,从而提高模型的表达能力和分类准确率。在池化层中,VGGNet使用最大池化(Max Pooling)来减少特征图的大小。

VGGNet有多个版本,包括VGG-16、VGG-19等。其中VGG-16包含16个卷积层和3个全连接层,其中VGG-19包含19个卷积层和3个全连接层。这些版本的VGGNet都在ImageNet图像分类竞赛中取得了优异的成绩,并成为了图像分类任务中的经典模型之一。

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

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

相关文章

分布式锁解决方案_Redis实现的分布式锁原理

获取锁 互斥:确保只有一个线程获得锁 添加锁 利用setnx的互斥性 启动Redis的我们进行测试看看怎么能某个数据来获得锁 setnx命令表示上锁只要是aa被创建出来我们不删除aa或者设定时间自动删除,那么这把锁就不能被释放开 释放锁 手动释放锁 如果我们…

Ubuntu20.04安装VTK8.2

Ubuntu20.04安装VTK8.2 相关依赖的安装安装步骤参考文献相关依赖的安装 sudo apt install checkinstall sudo apt-get install cmake-curses-gui sudo apt-get install freeglut3-dev sudo apt install libqt5x11extras5-dev sudo apt install cmake-qt-gui安装步骤 1、从官网…

【运筹优化】元启发式算法详解:禁忌搜索算法(Tabu Search,TS)+ 案例讲解代码实战

文章目录 一、介绍二、The Classical Vehicle Routing Problem 经典的车辆路径问题三、基本概念3.1 历史背景3.2 禁忌搜索3.3 搜索空间和邻域结构3.4 Tabus 禁忌3.5 解禁准则3.6 简单禁忌搜索的模板3.7 终止标准3.8 概率TS和候选列表 四、中级概念4.1 搜索强化4.2 多样化4.3 允…

Maven基础使用

Maven 学习目标 理解Maven的用途掌握Maven的基本操作掌握Maven如何创建Web项目 Maven是什么 面临问题 在学习Maven之前,我们先来看一下我们现在做的项目都有哪些问题。假设你现在做了一个crm的系统,项目中肯定要用到一些jar包,比如说myb…

opencv_c++学习(九)

一、图像二值化 固定阈值二值化 threshold ( lnputArray src, outputArray dst,double thresh, double maxvall, int typesrc:待二值化的图像,图像只能是CV_8U和CV_32F两种数据类型。对于图像通道数目的要求和选择的二值化方法相关。 dst:二值化后的图像&#xff…

【数据结构】哈希表上——开放寻址法

文章目录 前言映射哈希冲突开放寻址法思路分析结构分析函数实现插入删除寻找 结语 前言 大家好久不见,今天来讲解一下哈希表的基本原理并使用开放寻址法实现简单哈希表。 映射 哈希表的实现思路就是将一组数据映射成另外一组可以直接查找的数据,假如有…

【LeetCode】每日一题:链表部分经典题型

文章目录 1.反转链表2.链表的中间节点3.合并两个有序链表4.相交链表5.环形链表6.环形链表Ⅱ ​👻内容专栏:《LeetCode刷题专栏》 🐨本文概括:归纳链表部分经典题型。206.反转链表、876.链表的中间节点、21.合并两个有序链表、160.…

如何优雅地彻底解决 antd 全局样式问题

背景 由于某些原因,我们团队负责在组件 上做二次开发,简单理解就是封装组件,组件库选择了 antd,尴尬的是引入之后发现,父组件 自身是带一套全局样式的,而 子组件antd 又带了一套全局样式,导致 子…

字节原来这么容易进,是面试官放水,还是公司实在是太缺人?

本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到字节可以再给我一次机会,还是挺开心的。 本来以为有个机会就不错啦!没想到能成功上岸,在这里要特别感谢帮我内推的同学&…

《程序员面试金典(第6版)》面试题 16.24. 数对和

题目描述 设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。 题目传送门 示例 1: 输入: nums [5,6,5], target 11 输出: [[5,6]]示例 2: 输入: nums [5,6,5,6], target 11 输出: [[5,6],[5,6]]提示: nums.length &…

基于物联感知和GNSS技术的铁塔安全监测解决方案

监测背景 电力铁塔是承载电力供应的重要设施,它的安全性需要得到可靠的保障。但是铁塔一般安装在户外,分布广泛,且有很多安装在偏远地区,容易受到自然、人力的影响和破环。因此需要使用辅助的方法实时监控通信塔的安全状态&#x…

5th-Generation Mobile Communication Technology(二)

目录 一、5G/NR 1、 快速参考(Quick Reference) 2、5G Success 3、5G Challenges 4、Qualcomm Videos 二、PHY and Protocol 1、Frame Structure 2、Numerology 3、Waveform 4、Frequency Band 5、BWP 6、Synchronization 7、Beam Management 8、CSI Fra…

一文4000字从0到1用WebDriver+Selenium实现浏览器自动化

前言 Selenium是一款可以自动化操作浏览器的开源项目,最初的目的是浏览器功能的自动化测试,但是随着项目的发展,人们根据它的特性也用来做一些更多的有意思的功能而不仅仅是UI的自动化测试工具。就像Selenium官方网站上描述的那样&#xff0…

chatgpt怎么搭建,以及怎么接入企业微信工作台

gpt目前也用了一段时间了,用起来只能说越来越顺手,然后集成到企业微信让公司全部成员都用起来了。 使用界面如下: 主界面 功能: 1、通过企业微信认证后访问使用,防止非公司人员入侵 2、记录用户姓名和提问内容&#x…

IOS证书制作教程

转载:IOS证书制作教程 点击苹果证书 按钮 点击新增 输入证书密码,名称 这个密码不是账号密码,而是一个保护证书的密码,是p12文件的密码,此密码设置后没有其他地方可以找到,忘记了只能删除证书重新制作&am…

05-函数

函数的定义 函数名 函数名的后面有个圆换号(),代表这个为函数,不是普通的变量名。 形参 在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参数,简称…

.Net6 使用aspose.cells23.5.0

一、测试代码 internal class Program { static void Main(string[] args) { WorkbookDesigner wb new WorkbookDesigner(new Workbook()); var style new CellsFactory().CreateStyle(); style.Borders.SetColor(C…

LED显示屏控制系统分类

LED显示屏的控制系统可以根据不同的特点和功能进行分类。以下是常见的LED显示屏控制系统分类: 同步控制系统:同步控制系统通过传输同步信号来控制LED显示屏,确保多个显示屏之间的内容同步显示。同步控制系统适用于大型LED显示屏,如…

通过chatGPT学习:kubernetes中的list-watch机制介绍

1、 请解释一下,在kubernetes中的list-watch机制? Kubernetes是一个开源的容器编排和管理系统,它可以有效地管理大规模的容器化应用程序。 在Kubernetes中,list-watch机制是一种重要的机制,用于监视资源的变化并及时…

k8s系列(六)——Service服务发现

Service概述 为什么要使用Service Kubernetes Pod是平凡的,由Deployment等控制器管理的Pod对象都是有生命周期的,它们会被创建,也会意外挂掉。虽然它们可以由控制器自动重建或者滚动更新,但是重建或更新之后的Pod对象的IP地址等都…