VGG网络分析与demo实例

参考自 

  • up主的b站链接:霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频
  • 这位大佬的博客 Fun'_机器学习,pytorch图像分类,工具箱-CSDN博客

VGG 在2014年由牛津大学著名研究组 VGGVisual Geometry Group)提出,斩获该年 ImageNet 竞赛中 Localization Task(定位任务)第一名和 Classification Task(分类任务)第二名。

VGG 的创新点:

通过堆叠多个小卷积核来替代大尺度卷积核,可以减少训练参数,同时能保证相同的感受野。
论文中提到,可以通过堆叠两个3×3的卷积核替代5x5的卷积核,堆叠三个3×3的卷积核替代7x7的卷积核

1. CNN感受野

在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。
通俗的解释是,输出feature map上的一个单元 对应 输入层上的区域大小。

以下图为例,输出层 layer3 中一个单元 对应 输入层 layer2 上区域大小为2×2(池化操作),对应输入层 layer1 上大小为5×5
(可以这么理解,layer2中 2×2区域中的每一块对应一个3×3的卷积核,又因为 stride=2,所以layer1的感受野为5×5)
 

现在,我们来验证下VGG论文中的两点结

VGG网络有多个版本,一般常用的是VGG-16模型,其网络结构如下如所示:

pytorch搭建VGG网络

import torch.nn as nn
import torchclass 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.Dropout(p=0.5),nn.Linear(512*7*7, 2048),nn.ReLU(True),nn.Dropout(p=0.5),nn.Linear(2048, 2048),nn.ReLU(True),nn.Linear(2048, num_classes))if init_weights:self._initialize_weights()def forward(self, x):# N x 3 x 224 x 224x = self.features(x)# N x 512 x 7 x 7x = torch.flatten(x, start_dim=1)# N x 512*7*7x = self.classifier(x)return xdef _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)

这里有一点需要注意的是:

VGG网络有 VGG-13、VGG-16等多种网络结构

# vgg网络模型配置列表,数字表示卷积核个数,'M'表示最大池化层
cfgs = {'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],											# 模型A'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],									# 模型B'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],					# 模型D'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'], 	# 模型E
}# 卷积层提取特征
def make_features(cfg: list): # 传入的是具体某个模型的参数列表layers = []in_channels = 3		# 输入的原始图像(rgb三通道)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 = vreturn nn.Sequential(*layers)  # 单星号(*)将参数以元组(tuple)的形式导入def vgg(model_name="vgg16", **kwargs):  # 双星号(**)将参数以字典的形式导入try:cfg = cfgs[model_name]except:print("Warning: model number {} not in cfgs dict!".format(model_name))exit(-1)model = VGG(make_features(cfg), **kwargs)return model

train.py

model_name = "vgg16"
net = vgg(model_name=model_name, num_classes=5, init_weights=True)

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

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

相关文章

Java 新手常踩得坑,清个缓存就解决了?

【IDEA教程】IDEA 如何清除缓存? 大家好,我是 JavaPub。 最近遇到群里小伙伴遇到一个很大的难题,相信这个问题很多人在初入行时都遇到过。 事情是这样,一个小伙伴刚入职一家公司,公司给了他一个任务,虽然…

公司使用了加密软件,文件无法复制

在当今数字化时代,企业面临着越来越多的数据泄露和信息安全威胁。为了保护公司的敏感信息和知识产权,许多企业选择使用加密软件来加强数据的安全性。其中一项重要的功能是防止未经授权的文件复制。本文将探讨公司使用加密软件后,为何文件无法…

枚举算法:解决问题的穷举之道(二)

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

macOS系统下载安装PyCharm社区版本的流程(详细)

第一步 进入PyCharm官网,链接:Get Your Educational Tool - JetBrains 第二步 选择下拉框,根据自己的电脑芯片选择下载版本(芯片查看位置:设置-通用-关于本机)然后点击Download按钮 ​​​​​​​ -- 第…

AI:102-基于机器学习的法律勒索信息检测应用

🚀 本文选自专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中…

wait和sleep的区别大了去了!!!

1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。 sleep是Thread的静态类方法,谁调用的谁让出处理机,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码…

科研学习|论文解读——融合类目偏好和数据场聚类的协同过滤推荐算法研究

论文链接(中国知网): 融合类目偏好和数据场聚类的协同过滤推荐算法研究 - 中国知网 (cnki.net) 摘要:[目的/意义]基于近邻用户的协同过滤推荐作为推荐系统应用最广泛的算法之一,受数据稀疏和计算可扩展问题影响&#x…

005.HCIA 传输层

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP (Transmission Control Protocol)和用户数据包协议UDP (User Datagram Protocol)。 1、相关概念 a. 传输层的端口 端口范围:0-65535 知名端口:0-1023&…

图灵日记之java奇妙历险记--类和对象

目录 类的定义和使用类的定义格式 类的实例化类和对象的说明 this引用this引用的特性 对象的构造及初始化就地初始化构造方法 封装包导入包中的类自定义包 static成员static修饰成员变量static修饰成员方法 代码块代码块概念及分类构造代码块静态代码块 匿名对象 类的定义和使用…

运维工程师的出路到底在哪里

运维工程师的出路到底在哪里? 你是不是也常常听到身边的运维人员抱怨,他们的出路到底在哪里呢?别着急,让我告诉你,运维人员就像是IT界的“万金油”,他们像“修理工”一样维修服务器,像“消防员…

sleep(0)、sleep(1)与sleep(1000)函数是不是很迷?!

随着计算机科学和软件开发的飞速发展,开发者们常常需要在程序中引入一些时间控制的手段。其中,sleep函数成为了一种常见的工具,用于控制程序的执行速度、等待异步操作完成或者调度多线程任务。在这篇博客中,我们将深入研究三种睡眠…

安装、卸载、使用docker-compose

文章目录 Docker Compose一、安装Docker Compose二、卸载Docker Compose三、 使用docker compose编排nginxspringboot项目 Docker Compose 一、安装Docker Compose # Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装D…

在word文档中插入Latex格式的公式

用此方法可以不用在word中一点点插入公式,直接用Latex版的公式代码生成公式。 1.获取latex版公式 如我要在word中插入画框的公式,左边是该公式的latex版 也可以对公式截图使用如下的网页将公式的截图转为latex版 https://simpletex.cn/ai/latex_ocr …

Vue3超详细的ref()用法,看这一篇就够了

ref( ) 接受一个内部值,返回一个ref 对象,这个对象是响应式的、可更改的,且只有一个指向其内部值的属性 .value。 ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。 1、ref 对象是可更改的,即可以为 .value 赋予新的值…

Twinmotion教育版下载 / 找不到教育版解决方法

首先,在Epic Game Launcher中,找到Twinmotion标签 其中只有默认的试用版,没有教育版 众所周知,试用版没有相应的部分导出功能,而且有水印。 下载教育版: 1.打开官网:A cutting-edge real-time…

vue前端上传图片到阿里云OSS,超详细上传图片与视频教程

vue前端直传图片与视频到阿里云OSS 1. 简介与日常使用2. 为什么要这么干?是因为我司后端不行吗???(确实!)3. vue前端直传的操作4. 如何上传到阿里OSS指定文件夹呢? 1. 简介与日常使用 阿里云…

python高级(补充)

闭包 闭包的定义: 在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包 通过闭包的定义,我们可以得知闭包的形成条件: 1- 在函数嵌套(函数里面再定义…

【node-express】实现省县市/区三级联动接口

省县市/区三级联动接口 介绍接口步骤代码部分 介绍 源码地址:https://github.com/thinkasany/nestjs-course-code/tree/master/demo/address 使用 navicat 导入sql文件,新增表,然后只需要一个接口 localhost:3001/region?parentId1, 不断的…

Linux介绍、安装和常用指令

目录 Linux 介绍 Linux 发行版 安装 Linux 常用 Linux 指令 Linux 介绍 Linux 是一个广泛使用的开源操作系统,它是基于Unix的多用户、多任务系统,适用于服务器、桌面和嵌入式系统。Linux系统以其稳定性、安全性和灵活性而闻名。Linux的核心是Linux内…

SpringBoot运维(三)-- 多环境开发(yml多文件版)

目录 引言: 1. 多环境开发的配置 2. 多环境开发--根据功能拆分配置文件 引言: 多环境? 其实就是说你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样࿰