VGG详解

news2024/11/16 11:32:13

入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

✨完整代码在我的github上,有需要的朋友可以康康✨

https://github.com/tt-s-t/Deep-Learning.git

目录

一、VGG网络的背景

二、VGG网络结构

1、各网络结构参数图示

2、输入

3、双层 —— 一层卷积+(一层卷积+最大池化)

4、三层 —— 两层卷积+(一层卷积+最大池化) 

5、全连接层——分类判决

6、拓展:VGG16_bn

三、VGG网络的亮点——连续小卷积核代替大卷积核

四、VGG网络的不足

五、VGG代码实现


一、VGG网络的背景

AlexNet问世之后,很多学者通过改进AlexNet的网络结构来提高自己的准确率,主要有两个方向:小卷积核和多尺度。

而VGG的作者们则选择了另外一个方向,即加深网络深度。

VGGNet的网络结构简单、规整且高效。VGGNet较为典型的网络结构主要有VGG16和VGG19(两者并没有本质上的区别,只是网络深度不一样)。


二、VGG网络结构

1、各网络结构参数图示

 接下来以VGG16为例子来进行讲解

2、输入

(224,224,3)的RGB图像作为输入

3、双层 —— 一层卷积+(一层卷积+最大池化)

 这里总共4层。

都是使用卷积核为(3,3)的卷积层,每过一层(不含池化)尺寸不变,每过一层池化尺寸减半。

因此(224,224,3)->(224,224,64)->(112,112,64)->(112,112,128)->(56,56,128)

4、三层 —— 两层卷积+(一层卷积+最大池化) 

这里总共9层。

因此(56,56,128)-> (56,56,256)-> (28,28,256)-> (28,28,512)-> (14,14,512)-> (7,7,512)

5、全连接层——分类判决

 3层全连接层,将提取到的特征进行相应的整合判断,得出归属每一类的得分值。

6、拓展:VGG16_bn

就是在提取特征的每一层多加了BatchNorm2d层。

BatchNorm2d层的作用是:进行批量标准化处理(对于所有的batch中样本的同一个channel的数据元素进行标准化处理,即如果有C个通道,无论batch中有多少个样本,都会在通道维度上进行标准化处理,一共进行C次。),这样能把输入的数限制在一个范围内,把数据重新变为正态分布。

公式:

\hat{x}=\frac{x-\operatorname{mean}[x]}{\sqrt{\operatorname{Var}[x]+e p s}} * \gamma+\beta

具体结构如下:


三、VGG网络的亮点——连续小卷积核代替大卷积核

采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)

对于给定的感受野,采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层(3个3*3卷积附带3个ReLU,而一个7*7卷积只附带一个ReLU)可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。

在VGG中,使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5*5卷积核,这样可以在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。

✨替代原因✨

 如图所示,最上面的那个特征最终是由下面5*5的特征得到的,这样的效果跟一层5*5卷积的效果一样。

参数:3*3*2<5*5


四、VGG网络的不足

耗费更多计算资源,并且使用了更多的参数(这里不是因为多层3x3卷积),导致更多的内存占用。其中绝大多数的参数都是来自于第一个全连接层。


五、VGG代码实现

详见

https://github.com/tt-s-t/Deep-Learning.git

中的VGG文件夹。

这里只展示模型架构

import torch
import torch.nn as nn

class VGG(nn.Module):
    def __init__(self):
          super().__init__()

          self.features = nn.Sequential(
            nn.Conv2d(3,64,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(64,64,(3,3),padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
            nn.Conv2d(64,128,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(128,128,(3,3),padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
            nn.Conv2d(128,256,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(256,256,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(256,256,(3,3),padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
            nn.Conv2d(256,512,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(512,512,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(512,512,(3,3),padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2,2),
            nn.Conv2d(512,512,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(512,512,(3,3),padding=1),
            nn.ReLU(),
            nn.Conv2d(512,512,(3,3),padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2,2)
          )
          self.classifier = nn.Sequential(
            nn.Linear(25088,4096),
            nn.ReLU(),
            nn.Dropout(p=0.5),
            nn.Linear(4096,4096),
            nn.ReLU(),
            nn.Dropout(p=0.5),
            nn.Linear(4096,1000)
          )
    
    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, start_dim=1)
        x = self.classifier(x)
        return x

欢迎大家在评论区批评指正,谢谢大家~

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

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

相关文章

小侃设计模式(二十)-迭代器模式

1.概述 迭代器模式&#xff08;Iterator Pattern&#xff09;提供了一种方法访问一个容器对象中各个元素&#xff0c;而又不暴露该对象的内部细节。迭代器模式用于访问集合中的元素而不需要知道集合底层的数据形式。在JAVA语言中&#xff0c;迭代器模式已经成为其中不可缺少的…

3000字13张图详细介绍RAID0、1、5、6、10、50、60,非常值得收藏!

RAID简述 RAID 是一种用于提高数据存储性能和可靠性的技术&#xff0c;英文全称&#xff1a;Redundant Array of Independent Disks&#xff0c;中文意思&#xff1a;独立磁盘冗余阵列。RAID 系统由两个或多个并行工作的驱动器组成&#xff0c;这些可以是硬盘或者 SSD&#xf…

力扣刷题记录——344.反转字符串、345.反转字符串中的元音、349.两个数组的交集

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《344.反转字符串、345.反转字符串中的元音、349.两个数组…

Jvm 系列(十二) JVM的执行引擎全面讲解

JVM 执行引擎 1、执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理机、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行…

国产直流马达驱动芯片SS6216的功能参数以及应用

直流有刷电机驱动芯片SS6216是为消费类产品&#xff0c;玩具和其他低压或者电池供电的运动控制类应用提供了一个集成的有刷电机驱动器解决方案。是为低电压下工作的系统而设计的直流电机驱动集成电路&#xff0c;单通道低导通电阻。具备电机正转/反转/停止/刹车四个功能。 直流…

STL剖析(二):容器底层数据结构及常见用法

一.概述 本文主要聚焦于STL容器&#xff0c;STL完整的容器分类体系如下所示&#xff0c;下文将逐一对各个容器底层的数据结构以及常见用法进行介绍。 测试环境&#xff1a;Ubuntu 22.04 g 11.3.0 二.顺序容器 顺序容器都对应着线性数据结构。 2.1 array array的使用需要引…

6.2 微服务-SpringBoot

目录 6.2.1 SpringBoot 6.2.1.1 什么是Spring Boot 6.2.1.2 SpringBoot的特点 6.2.2 快速入门 6.2.2.1 创建工程 6.2.2.2 引入依赖 6.2.2.3 启动类 6.2.2.4 controller 6.2.2.5 测试 6.2.3 注解与属性注入 6.2.3.1 注解 6.2.3.1.1 EnableAutoConfiguration 6.2.3.1…

leetcode 240. 搜索二维矩阵 II-java题解

题目所属分类 从右上角出发往下遍历 倒是也可以二分 原题链接 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 代码案例&#xff1a; 输入&#xff1a;m…

加解密与HTTPS(4)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 在互联网应用中&#xff0c;安全性问题已经越来越突出。从DDoS攻击、矿机劫持、乌云事件&#xff08;白帽子变成黑帽子&#xff09;&#xff0c;到窃听、偷拍、强…

Word控件Spire.Doc 【Table】教程(1):在 Word 中创建表格-C#VB.NET

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

spring源码-资源资源加载器

Spring资源抽象Resource Spring对各种底层资源,比如文件系统中的一个文件&#xff0c;classpath上的一个文件&#xff0c;或者一个网络URL&#xff0c;统一抽象为接口Resource来表示 因为每个底层文件都可以以一个只读InputStream的方式打开&#xff0c;所以Resource接口继承…

ModuleNotFoundError: No module named ‘cs231n‘

在colab上完成cs231n的作业时发现&#xff0c;报了No module named cs231n’这个错误&#xff0c;查询后也没有找到合适的答案 仔细检查&#xff0c;发现是没有找到assignment1下的cs231n文件夹&#xff0c;然后去网站核对视频教程&#xff0c;发现没有搞错&#xff0c;视频中…

浮点数的储存

浮点数的储存一.浮点数的三段式&#xff08;S,E,M&#xff09;1.如何放入2.如何取出二.为什么浮点数不能直接比较三.解释第一个问题我们都知道整形在内存中是按照补码的形式储存的&#xff0c;但是浮点数的储存却和整数的截然不同&#xff0c;浮点数没有所谓是原反补并且浮点数…

SSM框架学习记录-MyBatisPlus_day01

1.入门案例与简介 MybatisPlus是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提供效率 未使用MybatisPlus时&#xff0c;在dao接口中的代码如下&#xff1a; Mapper public interface UserDao {Select("select * from user where id#{id}")publ…

冬日宅家选哪款投影仪比较好?极米H5陪你温暖过冬天

随着室外温度的逐步下降&#xff0c;寒冬也真的来了。相信对于许多朋友来说&#xff0c;宅家是冬季最惬意的时光&#xff0c;就是开着空调、电暖风、暖气&#xff0c;在温暖的室内&#xff0c;再打开投影仪&#xff0c;用超大屏追剧、看看电影&#xff0c;听听美妙的音乐&#…

光伏二次设备概述

概述 分布式光伏发电项目一般根据并网的电压等级分为380V和10KV。一般电压等级为380V低压并并网基本不涉及到什么二次产品&#xff0c;通常采用光伏并网柜就能解决&#xff0c;常见的并网设备为防孤岛保护装置和电能质量在线监测装置为主。而10KV并网的光伏容量一般处于1MWP到1…

加强企业数据库安全的行为准则

现在大多数企业都拥有可靠的网络安全程序&#xff0c;这些程序利用多种控件来实现深度防御安全性。通过这些程序&#xff0c;企业服务器得到加固&#xff0c;企业端点得到保护&#xff0c;监控工具也得以部署。还能够消除来自端点设备的高度敏感信息&#xff0c;并整合企业系统…

基于jsp+sevlet+mysql实验室设备管理系统

基于jspsevletmysql实验室设备管理系统一、系统介绍二、功能展示1.通知公告(学生)2.实验设备借用申请(学生)3.设备借用记录(学生)4.实验室预约申请(老师)5.实验室预约记录(老师)6.实验设备借用申请(老师)7.设备借用记录(老师)8.通知公告(管理员)9.实验室管理(管理员)10.设备管理…

QA | 关于可编程信号发生器,您在使用中可能遇到的问题

Q1&#xff1a;为什么信号源插在电脑上会显示电压不足&#xff1f; A&#xff1a;通常需要比普通电脑USB接口能提供更大的功率&#xff0c;需要高达2.0A的电流&#xff0c;超出了许多老式 USB 端口的水平。可以通过多种方式满足这一要求。适配器、USB 3.0计算机/笔记本电脑端口…

python——Matplotlib之fill_between函数

Matplotlib是Python提供的一套基于NumPy的绘图工具包&#xff0c;用Python实现与MATLAB相似的命令API&#xff0c;十分适合交互式绘制图表&#xff0c;成为Python中应用非常广的绘图工具包之一。 在对数据可视化时&#xff0c;为了突出某一段数据需要对部分区域进行填充处理。…