神经网络-VggNet

2014年VggNet被推出,获取了ILSVRC2014比赛分类项目的第二名,第一名是GoogleNet,该网络在下节介绍,本节主要介绍VggNet。

VggNet可以称为是一个家族,根据层数的不同包括了A、A-LRN、B、C、D等网络结构,其中D、E也就是常见的VggNet16、VggNet19,网络层从初始的11层增加到了19层,但参数并没有明显的增加,因为参数主要集中在全连接层。以下是VggNet网络家族网络层介绍(增加的网络层,用粗体标注),参数表示“conv〈receptive field size〉-〈number of channels〉”。

每个网络结构参数,如下:

网络结构

以VggNet16为例,各层网络结构如下:

  • 输入图像3*224*224-》使用64个3*3的卷积核做两次卷积-》经过ReLU,输出为64*224*224

  • 使用Maxpooling进行池化,池化大小为2*2,输出64*112*112

  • 输入64*112*112-》使用128个3*3的卷积核做两次卷积-》经过ReLU,输出为128*112*112

  • 使用Maxpooling进行池化,池化大小为2*2,输出128*56*56

  • 输入128*56*56-》使用256个3*3的卷积核做三次卷积-》经过ReLU,输出为256*56*56

  • 使用Maxpooling进行池化,池化大小为2*2,输出256*28*28

  • 输入256*28*28-》使用512个3*3的卷积核进行三次卷积-》经过ReLU,输出512*28*28

  • 使用Maxpooling进行池化,池化大小为2*2,输出512*14*14

  • 输入512*14*14-》使用512个3*3的卷积核进行三次卷积-》经过ReLU,输出512*14*14

  • 使用Maxpooling进行池化,池化大小为2*2,输出512*7*7

  • 连接两层1*1*4096全连接层

  • 连接一层1*1*1000进行全连接-》经过ReLU

  • 通过softmax输出1000个预测结果的概率值

通过上面网络层介绍,可以发现,卷积核从64个,陆续进行翻倍增加,64-》128-》256-》512,专注于通道数增加;池化层采用较小的2*2。整体小卷积核、小池化核使得模型架构更深更宽的同时,计算量的增加放缓

在网络测试阶段,将训练阶段的三个全连接层替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。

网络亮点

数据增强

  • 对图像进行镜像翻转和random RGB colour shift ,扩大样本数量

  • 对数据进行随机的裁剪,将图片裁剪为224*224大小

  • 多种尺寸训练:1)分别使用256*256和384*384固定大小的图片进行模型的训练;2)多尺度的模型训练,对图像进行缩放,缩放范围为256~512,可以理解为一种数据的抖动,增加了数据量。

下面是采用不同尺度后,模型top1和top5的效果。

数据预处理

  • 对图像每个像素值减去RGB的平均值,得到新的像素值。

  • 在某些网络结构中,使用了Local Response Normalisation,发现并没有带来效果的提升,反而增加了内存和计算时间,因此后续网络结构中并未继续使用该处理方法。

参数初始化

网络权重的初始化很重要,因为糟糕的初始化会因为深度网络中的梯度不稳定而导致学习停滞。当网络层较少时,参数值使用随机初始化;当网络层较多时,需要更加合理的参数初始化方法。

VggNet在训练A网络结构时,采用了随机方法,通过训练得到了一组实验参数。在后续的网络结构如D、E网络,利用A网络中的参数,初始化了前4层网络结构和最后三层全连接层,中间的网络层使用随机初始化进行训练。初始化参数满足均值=0,方差=0.01的正态分布,biases初始化0.

不过作者后续发现,可以不使用预训练来确定参数,可以使用Golort&Bengio(2010),进行初始化。目前有更加多的初始化方法。

多个小卷积核代替大卷积核

用多个小的卷积代替了较大的卷积核,例如,两个3*3的卷积核叠加等价于5*5卷积核的视野,三个3*3的卷积核叠加等价于7*7的卷积核视野。

多个小卷积核叠加为什么会等于大卷积核视野?

假设图像是28*28,卷积核的大小为5*5,s=1,p=0,则输出大小为(28-5+2*0)/1+1 = 24;

同样使用两个3*3的卷积核,s=1,p=0,第一个卷积核作用后,输出(28-3+2*0)/1+1=26;继续进行第二个卷积核,输出大小为(26-3+2*0)/1+1=24,从结果上看,两者处理的结果是一致的。

上面计算过程,可简化为如下图形。3个3*3卷积核替代7*7卷积核,同理。

多个小卷积核代替大卷积核,有什么好处?

  • 多个小卷积核,相对于单一的使用一个卷积核。多个卷积核具有更强的非线性映射,可以获得更多的图像特征,从而使得决策函数有更好的识别力。

  • 多个小卷积核的总参数,小于单个大卷积核的参数。假设输入通道数和输出通道数分别为input_channel 和output_channel,对于两个3*3的参数量为2*3*3*input_channel *output_channel,一个5*5卷积核的参数量为1*5*5*input_channel *output_channel,两个参数量比较5*5的参数量是多个小卷积核的1.39倍(25/18)。小卷积核替代大卷积核,参数量级的减少是其优势的一部分,更重要的是计算量的减少更加明显。

  • 多个小卷积核代替大卷积核,例如3个3*3的卷积核,替代7*7的卷积核。相当于一定程度上进行了正则化,同时通过多个卷积核进行分解,每个卷积核之后加入了ReLU激活函数,增加了非线性表示,使得整体特征提取能力得到了提升。

多个小卷积核代替大卷积核,有什么坏处?

  • 在进行反向传播时,中间的卷积层可能会占用更多的内存。

1*1卷积核

1*1卷积核,可以增加decision function的非线性能力,同时不影响卷积核的视野。1*1卷积核,可以起到以下作用。

  • 起到降维和升维的作用

  • 增加非线性:可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep。

  • 跨通道信息交互:1*1的卷积核,实际上是对不同channel的信息,进行了线性组合,实现了通道间的信息交互。

应用

网络结构定义

import torch.nn as nn
import torch# official pretrain weights,官网直接下载模型权重
model_urls = {'vgg11': 'https://download.pytorch.org/models/vgg11-bbd30ac9.pth','vgg13': 'https://download.pytorch.org/models/vgg13-c768596a.pth','vgg16': 'https://download.pytorch.org/models/vgg16-397923af.pth','vgg19': 'https://download.pytorch.org/models/vgg19-dcbb9e9d.pth'
}# 定义网络
class VGG(nn.module):"""features: 定义网络结构,num_classes: 分类数init_weights: 权重是否初始化"""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):# barch * 3 * 224 * 224x = self.features(x)x = torch.flatten(x, start_dim=1)x = self.classifier(x)return x# 定义初始化方法def _initialize_weights(self):# 读取每层网络for m in self.modules():if isinstance(m, nn.Conv2d):# 用均匀分布进行填充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.constant_(m.bias, 0)# 将网络配置参数,转变为对应的网络结构
def make_features(cfg:list):layers = []in_channels = 3for v in cfg:if v == "M":# 网络中池化层,size=2,stride=2layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:# 卷积层 stride=1, padding=1conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)layers += [conv2d, nn.ReLU(True)]in_channels = vreturn nn.Sequential(*layers)# 配置网络参数,64代表卷积核的个数,M代表池化层
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'],
}

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

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

相关文章

docker-compose搭建sfpt服务器

1. 搭建 创建sftp目录,进入该目录创建docker-compose.yml文件内容如下: version: 3.7services:sftp:image: atmoz/sftpcontainer_name: sftpports:- "122:22"volumes:- ./sftp-data:/homeenvironment:SFTP_USERS: "liubei:liubei161:10…

计算机视觉目标检测-1

文章目录 摘要Abstract1.目标检测任务描述1.1 目标检测分类算法1.2 目标定位的简单实现思路1.2.1 回归位置 2.R-CNN2.1 目标检测-Overfeat模型2.1.1 滑动窗口 2.2 目标检测-RCNN模型2.2.1 非极大抑制(NMS) 2.3 目标检测评价指标 3.SPPNet3.1 spatial pyr…

减速机润滑油的选用原则

减速机在投入运行前必须加入适当粘度的润滑油,须使齿轮间摩擦减小,遇高负荷及冲击负荷时,减速机才能充分发挥其机能。那么,应该如何选择减速机的润滑油呢? 1、粘度选择:粘度是齿轮油的一个重要理化指标&…

解线性方程组

直接三角分解(LU分解,Doolittle分解) ATM分解(追赶法,Crout分解,克劳特分解) 平方根法(Cholesky分解,乔列斯基分解) 矩阵的范数

使用 OpenCV 在图像中添加文字

在图像处理任务中,我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数,可以很方便地在图像上绘制文本,支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字,介绍 cv2.putTe…

如何高效学习PHP框架源码

为什么学习php框架源码 学习PHP框架源码是软件开发领域中的一个重要环节,它带来了诸多益处,无论是对于个人技能的提升,还是对于实际项目开发的优化,都有着不可忽视的作用。以下是一些具体的原因,解释了为什么学习PHP框…

HAL库STM32硬件IIC驱动数字电位器MCP4017

目录 一、芯片特性 二、硬件电路 三、工程搭建 四、IIC硬件地址 五、驱动程序 项目需要,最近用到了一个IIC接口的数字电位器,型号:MCP4017T-502E。对应阻值5K,使用STM32G030F6的硬件IIC驱动,发现简单的不得了&…

git设置项目远程仓库指向github的一个仓库

要将你的Git项目设置为指向GitHub上的远程仓库,你需要执行以下步骤: 创建GitHub仓库: 登录到你的GitHub账户。点击右上角的 “” 号,选择 “New repository” 创建一个新的仓库。填写仓库的名称,可以添加描述&#xff…

Vim 编辑器详细教程

Vim 编辑器详细教程 Vim 是一个强大的文本编辑器,以其高效的编辑能力和强大的功能著称,特别适合程序员和文字处理工作者。以下是一个详细的 Vim 教程,从基础操作到高级用法。 1. Vim 基础操作 1.1 Vim 的三种模式 正常模式(Nor…

uni-app 中使用微信小程序第三方 SDK 及资源汇总

🎀🎀🎀uni-app 跨端开发系列 🎀🎀🎀 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …

17.2、应急事件场景与处理流程

目录 常见网络安全应急事件场景网络安全应急处理流程应急演练类型 常见网络安全应急事件场景 应急事件的处理场景,分成四类场景,恶意程序事件,网络攻击事件,还有网站相关的一些安全事件,最后是拒绝服务事件 恶意程序…

PostgreSQL表达式的类型

PostgreSQL表达式是数据库查询和操作中非常重要的组成部分。它们由一个或多个值、运算符和PostgreSQL函数组合而成,用于求值或执行特定的操作。PostgreSQL表达式类似于公式,是用查询语言编写的。它们可以用于查询数据库中的特定数据集,或者在进行数据操作时执行计算和逻辑判…

.NET能做什么?全面解析.NET的应用领域

.NET 是由微软开发的一个开源、跨平台的开发框架。它不仅支持构建各种应用程序,还能运行在不同的操作系统上,包括 Windows、Linux 和 macOS。自从 .NET Core 的推出,.NET 成为了一个现代化的开发平台,能够满足企业和开发者日益多样…

19_HTML5 Web Workers --[HTML5 API 学习之旅]

HTML5 Web Workers 是一种允许 JavaScript 在后台线程中运行的技术,从而不会阻塞用户界面或其他脚本的执行。通过使用 Web Workers,你可以执行复杂的计算任务而不影响页面的响应速度,提升用户体验。 Web Workers 的特点 Web Workers 是 HTM…

十二、SQL 进阶:高级技巧提升查询效率实战指南

SQL 进阶:高级技巧提升查询效率实战指南 一、索引优化:数据库的“高速公路” 索引犹如图书馆里的书籍索引卡,可使数据库迅速定位所需数据,避免全表扫描。例如,在存储员工信息的表employees(包含字段emplo…

Java 23和JDK 23详细安装方法,常用命令使用等

Java JDK 23 是 Oracle 提供的最新版本的 Java 开发工具包,它包含了 Java 编程语言的最新特性和改进。本教程将介绍如何安装 JDK 23,并详细讲解一些常用的命令和用法。 一、安装 JDK 23 下载 JDK 23: 提供了 Windows、macOS 和 Linux 的安装…

红黑树 Red-Black Tree介绍

1. 红黑树的定义 红黑树是一种具有如下性质的二叉搜索树: 每个节点是红色或黑色。根节点是黑色。所有叶子节点都是黑色的空节点(NIL节点),即哨兵节点。如果一个节点是红色,那么它的子节点一定是黑色。(不存…

《解锁 Python 数据挖掘的奥秘》

《解锁 Python 数据挖掘的奥秘》 一、Python 数据挖掘基础(一)Python 基础与数据挖掘环境搭建(二)数据挖掘基本流程概述 二、Python 数据挖掘核心技术(一)数据收集与预处理技术(二)常…

爆改RagFlow

Rag理论概述 由近期 RAGFlow 的火爆看 RAG 的现状与未来 Ragflow解析参数说明 ♥ RagFlow源码解析 实际的文件解析通过接口 /v1/document/run 进行触发的,实际的处理是在 api/db/services/task_service.py 中的 queue_tasks() 中完成的,此方法会根据文件…

【GeekBand】C++设计模式笔记15_Proxy_代理模式

1. “接口隔离” 模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题,甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式 FacadeProxyAdapte…