【动手学深度学习PyTorch版】18 使用块的网络 VGG

news2024/12/19 14:02:05

上一篇请移步【动手学深度学习PyTorch版】17 深度卷积神经网络 AlexNet_水w的博客-CSDN博客

目录

一、使用块的网络 VGG

1.1 AlexNet--->VGG

◼ VGG网络简介

1.2 VGG架构

1.3 总结

二、VGG网络的代码实现

2.1 VGG网络(使用自定义)


一、使用块的网络 VGG

1.1 AlexNet--->VGG

AlexNet最大的问题是不规整,结构不那么清晰。我如果想要变深变大,来得到更好的精度,就需要更好的设计思想。

那么,问题就是怎么样变深变大?

因此, AlexNet思路的拓展,提出了一个叫VGG块的东西。

VGG块的核心思想是:用大量的3X3的卷积层堆起来,得到VGG块,得到最后的网络。

所以为什么用的是3X3卷积层而不是5X5卷积层?

是因为VGG块也尝试过使用5X5卷积层,但是发现在同样计算开销的情况下,堆更多的3X3卷积层的效果比用少一些的5X5卷积层更好,因为5X5卷积层的计算量比3X3卷积层大。

所以VGG块使用了n层的3X3卷积层,再加上一个2X2的最大池化层。

◼ VGG网络简介

VGG网络主要证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构,VGG16和VGG19,两者并没有本质区别,只是网络深度不一样。VGG模型中卷积核大小全部为3*3。

VGGNet是由⽜津⼤学计算机视觉组参加图像分类竞赛时提出的,VGG即Visual Geometry Group,VGGNet相对于AlexNet来说,其在深度上翻了⼀番,最深可达19层,所以叫做Very Deep。

VGG可以应用在人脸识别、图像分类等方面,分别从VGG16~VGG19。

VGG研究卷积网络深度的初衷是想搞清楚卷积网络深度是如何影响大规模图像分类与识别的精度和准确率的,最初是VGG-16号称非常深的卷积网络全称为(GG-Very-Deep-16 CNN),VGG在加深网络层数同时为了避免参数过多,在所有层都采用3x3的小卷积核,卷积层步长被设置为1。

VGG的输入被设置为224x244大小的RGB图像,在训练集图像上对所有图像计算RGB均值,然后把图像作为输入传入VGG卷积网络,使用3x3或者1x1的filter,卷积步长被固定1。

VGG全连接层有3层,根据卷积层+全连接层总数目的不同可以从VGG11 ~ VGG19,最少的VGG11有8个卷积层与3个全连接层,最多的VGG19有16个卷积层+3个全连接层.

此外VGG网络并不是在每个卷积层后面跟上一个池化层,还是总数5个池化层,分布在不同的卷积层之下,下图是VGG11 ~GVV19的结构图:

与AlexNet、LeNet一样,VGG网络可以分为两个部分:第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。如下图所示:

VGG神经网络连续连接上图的几个VGG块(在vgg_block函数中定义)。其中有超参数变量conv_arch。该变量指定了每个VGG块里的卷积层的个数和输出通道数。全连接模块则与AlexNet中的相同。

原始VGG网络中有5个卷积块,其中前两个块各有一个卷积层,后三个块包含两个卷积层。第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,直到数字达到512。由于该网络使用8个卷积层和3个全连接层,因此它通常被称为VGG-11。
 

1.2 VGG架构

其实就是替换掉了AlexNet的整个卷积层的架构,替换成n个VGG块,串在一起。

可以串不同的VGG块,不同大小得到不同的架构。比如VGG-16结构,VGG-19结构。

从图中可以看出, 现在的进度,AlexNet是一个很快的网络,每秒钟大概能做5000多次计算的样子,精度其实是不高的。VGG对的提升是很大的,但是代价是会慢很多,会慢5,6倍的样子,因为VGG更深了。

VGG是一个非常占内存的网络,VGG有一系列的模型,不同的模型中,快一点的模型自然精度低一些。

1.3 总结

 

二、VGG网络的代码实现

2.1 VGG网络(使用自定义)

(1)VGG块的实现,

需要的超参数:重复多少个卷积层、输入通道数、输出通道数

import torch
from torch import nn
from d2l import torch as d2l

def vgg_block(num_convs,in_channels,out_channels):   # 需要的超参数:卷积层个数、输入通道数、输出通道数
    layers = []
    for _ in range(num_convs):   # 重复n次
        # 每次加入卷积层
        layers.append(nn.Conv2d(in_channels,out_channels,kernel_size=3,padding=1))      
        layers.append(nn.ReLU())   # 每层后面加入激活函数
        in_channels = out_channels   # 更换
    layers.append(nn.MaxPool2d(kernel_size=2,stride=2))   # 最后加入一个最大池化层
    # 把这些层丢到Sequential,构成一个VGG块
    return nn.Sequential(*layers) # *layers表示把列表里面的元素按顺序作为参数输入函数     

(2)VGG-11网络:8个卷积层, 3个全连接层

需要告诉我一个架构:一共有5块,每一次告诉这一块里面有多少个卷积,通道数是多少。

根据每一块,调用函数vgg_block进行构建,

conv_arch = ((1,64),(1,128),(2,256),(2,512),(2,512)) # 第一个参数为几层卷积,第二个参数为输出通道数

def vgg(conv_arch):
    conv_blks = []
    in_channels = 1
    for (num_convs, out_channels) in conv_arch:
        # 根据每一块,调用函数vgg_block进行构建
        conv_blks.append(vgg_block(num_convs,in_channels,out_channels))
        in_channels = out_channels
    # 与AlexNet相同, 
    return nn.Sequential(*conv_blks, nn.Flatten(),
                         nn.Linear(out_channels * 7 * 7, 4096),nn.ReLU(),  # 线性层:输入宽度为out_channels * 7 * 7
                         nn.Dropout(0.5), nn.Linear(4096,4096),nn.ReLU(),
                         nn.Dropout(0.5), nn.Linear(4096,10))

(3)观察每个层输出的形状,

net = vgg(conv_arch)

# 观察每个层输出的形状
X = torch.randn(size=(1,1,224,224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__,'output shape:\t', X.shape) # VGG使得高宽减半,通道数加倍

从图中我们可以看得到,

  • 首先输入224X224进来,第一块就使得高宽减半成112,通道数拉到了64。
  • 然后第二块使得通道数翻倍成128,高宽再减半成54。
  • 然后一直翻倍减半,翻倍减半,
  • 直到最后一层第五层的时候,没有翻倍减半了。

整体的思想就是,我把一个网络分成5块,每块把通道数翻倍,高宽减半,这是我们经常在神经网络用到的一个设计模式。

(4)由于VGG-11比AlexNet计算量更大,因此2我们构建了一个通道数较少的网络来训练,所以把所有通道数除以4。

参数上我们还是跑10次,批量大小为128,学习率稍微大一些为0.05,

# 由于VGG-11比AlexNet计算量更大,因此构建了一个通道数较少的网络,所以把所有通道数除以4
ratio = 4
small_conv_arch = [(pair[0], pair[1]//ratio) for pair in conv_arch] # 所有输出通道除以4
net = vgg(small_conv_arch)

lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size,resize=224)    
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,d2l.try_gpu())

 

从图中我们可以看得到,VGG-11已经是VGG里面比较小的网络了,通道数已经除以4了,认为是计算量减少了16倍,

计算复杂度=输入X输出

计算量减少了16倍的情况下,还是比AlexNet慢,要慢一倍。但是VGG-11的精度还不错,AlexNet是0.88,但是它是0.932。

意思是就算我用了一个VGG里面比较小的网络VGG-11,精度还是有不小的提升,用了更小的窗口但更深。

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

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

相关文章

软件测试基本概念

目录本章要点什么是软件测试?软件测试的特定?软件测试和开发的区别?软件测试和软件开发中的调试有什么区别?软件测试在不同公司的定位?一个优秀的测试人员应该具备的素质(你为啥要选择测试开发)需求是衡量软件测试的依据从软件测试人员角度看需求为啥需求对软件测试人员如…

SpringBoot 面试题总结 (JavaGuide)

SpringBoot 面试题总结 (JavaGuide) 用 JavaGuide 复习 SpringBoot 时,找到一些面试题,没有答案,自己花了一天时间在网上找资料总结了一些,有些答案的来源比较杂忘了没有标注,望见谅。 1. 简单…

Visual Studio 2022开发Arduino详述

目录: 一、概述 二、软件的下载与安装 1、前言 2、Visual Studio 2022的下载与安装 3、Visual Micro扩展插件的导入 4、Visual Micro的使用 1)安装修改插件 2)搜索 : Visual.Micro.Processing.Sketch.dll 3)打开Visual.…

【Linux学习】基础IO

目录前言一、C语言文件IO1. C语言文件接口以及打开方式2. 对当前路径的理解3. 默认打开的三个流二、 系统文件IO1. 系统接口openwritereadclose系统接口和库函数2. 文件描述符及其分配规则文件描述符文件描述符分配原则3. 重定向及dup2系统调用重定向标准输出和标准错误的区别d…

Linux XWindow的安装和配置

1.开始安装XWindow必须需要的组件 输入指令:yum groupinstall "X Window System" yum groupinstall "X Window System" 选择y继续安装。 当看到complete表示已经安装成功了。 输入startx测试一下 看到如上界面就证明你的XWindow安装成功了。 2…

Python数据分析(3):pandas

文章目录二. pandas入门2.1 数据结构2.1.1 Series对象2.1.2 DataFrame对象2.2 读取数据2.2.1 读取Excel:read_excel()1. 读取特定工作簿:sheet_name2. 指定列标签:header3. 指定行标签:index_col4. 读取指定列:usecols…

TypeScript接口——interface

目录 一、接口概述: 二、接口类型介绍: 1、属性接口: 2、 函数接口: 3、可索引接口: (1)可索引接口约束数组示例: (2) 可索引接口约束对象示例&#xf…

【Python】numpy矩阵运算大全

文章目录前言0 遇事不决,先查官网,查着查着就查熟了1 矩阵运算及其必要性2 矩阵的创建2.1 普通矩阵2.2 特殊矩阵3 矩阵的索引3.1 str, list, tupple的索引3.2 numpy索引4 矩阵的运算4.1 通用函数与广播机制4.3 矩阵乘法4.4 矩阵求逆4.5 矩阵转置4.6 向量…

SpringBoot整合mybatis-plus 实现增删改查和分页查询

SpringBoot整合mybatis-plus 实现增删改查和分页查询整体的运行图片:一、环境搭建:1、依赖2、application.yml文件3、数据库二、实体类:三、数据层开发——基础CRUD四、业务层开发——分页功能制作4.1分页配置类 configuration4.2service接口…

【Node.js】模块化学习

Node.js教学 专栏 从头开始学习 目录 模块化的基本概念 什么是模块化 现实中的模块化 编程领域中的模块化 模块化规范 Node.js中的模块化 Node.js中模块的分类 加载模块 Node.js中的模块作用域 什么是模块作用域 模块作用域好处 向外共享模块作用域中的成员 module对象 modu…

第二站:分支与循环(终幕)一些经典的题目

目录 一、计算n的阶乘 1.一般解法 2.优化不能表示出较大数的阶乘 二、 计算 1!2!3!……10! 1.循环嵌套解法 2.一次循环解法(优化计算时间) 三、在一个有序数组中查找具体的某个数字n 1.遍历查找 2.二分查找算法(优化了查找时间) 四、编写代码&am…

IDEA Out of memory 问题

文章目录1. 前提2. 问题记录与解决方案1. 前提 阅读本文之前,读者要首先把 Out of memory 这个问题的解决方案多搜几个帖子,先按照其他帖子的解决方案(修改配置文件Xmx属性等)尝试一遍,不能解决再参考本文。 本文所描…

前端小游戏——植物大战僵尸

给大家分享一个植物大战僵尸网页游戏源代码,感兴趣的小伙伴可收藏学习 👉完整源码 文章目录⌛️效果展示⌛️游戏介绍⌛️游戏内容(1)冒险模式(2)小游戏⌛️图片资源⌛️代码展示(1)…

【黑猩猩算法】基于加权反对技术和贪婪搜索进化黑猩猩优化算法求解多模态工程问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

终于拿到了阿里P8架构师分享的JCF和JUC源码分析与实现笔记java岗

时代的一粒尘,落在每个人身上,就是一座山”。 时代更迭变换,我们好像都知道今天与昨天不同,又好像肉眼看不出哪里不同。 但其实它就正在以各种各样的方式体现在每一个普通人身上。 疫情爆发三个月的时间,截止2020年…

~外中断~

目录 一、接口芯片和端口 二、外中断信息 三、PC机键盘的处理过程 一、接口芯片和端口 外设的输出不直接送入内存和CPU,而是送入相关的接口芯片的端口中;CPU向外设的输出也不是直接送入外设,而是先送入端口,再由相关的芯片送到…

C语言程序设计--火车订票系统

任务要求: 创建一个火车票管理系统,功能包括: (1)录入班次信息(信息用文件保存),可不定时地增加班次数据 (2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班 次的发车时间,则…

js中map()的使用详解

引入: 有网友有如下困惑: map是数组的方法,有一个参数,参数是一个函数,函数中有3个参数 参数1:item必须。当前元素的值 参数2:index,可选。当前元素在数组中的索引值 参数3&#xff…

CentOS 7迁移Anolis OS 7 ——筑梦之路

迁移注意事项 Anolis OS 7生态上和依赖管理上保持跟CentOS7.x兼容,一键式迁移脚本centos2anolis.py,实现CentOS7.x到Anolis OS 7的平滑迁移。 使用迁移脚本前需要注意如下事项: 迁移涉及到软件包的重新安装,是不可逆过程&#…

BBR/CUBIC 共存时的 buffer 挤兑

BBR 与 CUBIC 共存时的收敛图,理论情况: 理论上 BBR 不会挤占 buffer,inflight 保持为恒定的 BDP。 但 BBR 的 inflight 做不到恒定,多流共存时,依然会 “主动占用 buffer” 而相互挤兑带宽,而该行为是必须…