当前位置: 首页 > news >正文

神经网络-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'],
}

相关文章:

神经网络-VggNet

2014年VggNet被推出,获取了ILSVRC2014比赛分类项目的第二名,第一名是GoogleNet,该网络在下节介绍,本节主要介绍VggNet。 VggNet可以称为是一个家族,根据层数的不同包括了A、A-LRN、B、C、D等网络结构,其中…...

用AI生成PPT,告别繁琐,一键生成高效方案

用AI生成PPT,告别繁琐,一键生成高效方案!制作PPT曾经是一件非常繁琐的工作。让人又爱又恨,爱的是它可以让你的想法可视化,恨的是,要做出一份精美的PPT,往往需要耗费大量时间和精力。现在AI技术的…...

基于 `android.accessibilityservice` 的 Android 无障碍服务深度解析

基于 android.accessibilityservice 的 Android 无障碍服务深度解析 目录 引言无障碍服务概述架构设计核心功能设计模式核心要点实现细节性能优化安全与隐私案例分析未来展望结论引言 在当今的移动应用生态系统中,无障碍服务(Accessibility Service)扮演着至关重要的角色。…...

UE5材质节点Frac/Fmod

Frac取小数 Fmod取余数 转场效果 TimeMultiplyFrac很常用 Timesin / Timecos 制作闪烁效果...

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。动图演示: 在微服务系统…...

Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案

文章目录 1.1.网络和io操作线程配置优化1.2.log数据文件刷盘策略1.3.日志保留策略配置1.4.replica复制配置1.5.配置jmx服务1.6.系统I/O参数优化1.6.1.网络性能优化1.6.2.常见痛点以及优化方案1.6.4.优化参数 1.7.版本升级1.8.数据迁移1.8.1.同集群broker之间迁移1.8.2.跨集群迁…...

小程序租赁系统构建指南与市场机会分析

内容概要 在当今竞争激烈的市场环境中,小程序租赁系统正崭露头角,成为企业转型与创新的重要工具。通过这个系统,商户能够快速推出自己的小程序,无需从头开发,节省了大量时间和资金。让我们来看看这个系统的核心功能吧…...

SOME/IP 协议详解——远程过程调用(RPC)

文章目录 1. 传输协议绑定1.1 UDP 绑定1.2 TCP 绑定1.3 多服务实例(重要)1.4 通过 UDP 传输大型 SOME/IP 消息(SOME/IP - TP) 2. 请求 / 响应通信3. Fire&Forget 通信4. 通知事件5. 字段6. 错误处理6.1 返回码6.2 错误消息6.3…...

C++ 设计模式:命令模式(Command Pattern)

链接:C 设计模式 链接:C 设计模式 - 访问者模式 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志…...

安卓/system/bin下命令中文说明(AI)

ATFWD-daemon:AT指令转发守护进程,用于将AT指令从应用层转发到调制解调器。 PktRspTest:数据包响应测试工具。 StoreKeybox:存储密钥盒工具,用于安全地存储加密密钥。 WifiLogger_app:WiFi日志记录应用&…...

MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求,有一部分算法的代码需要MATLAB来进行处理,而最后需要集成到C#中的wpf项目中去,选择灵活性更高的dll,去进行集成。(可以简单理解为:将MATLAB的函数,变为C#中类的函数成员&…...

【SpringBoot3】Spring Boot 3.0 集成 Mybatis Plus

文章目录 一、什么是 Mybatis Plus 特性 二、Spring Boot 3.0 集成 Mybatis Plus三、Mybatis Plus 查询示例 1、普通查询2、分页查询 参考 一、什么是 Mybatis Plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只…...

nvidia_gpu_exporter 显卡监控

导入 grafana/dashboard.json https://github.com/utkuozdemir/nvidia_gpu_exporter/blob/master/grafana/dashboard.json参考 nvidia_gpu_exporter...

WebSocket 的封装使用

import { ElMessage } from "element-plus";// 全局WebSocket实例 let ws null; let isConnected false; let currentWsUrl ; // 用于存储当前的wsUrl let baseURL ws://XXX.com:8081;const initWebSocket (wsUrl, sendData) > {return new Prom…...

SqlSession的线程安全问题源码分析

🎮 作者主页:点击 🎁 完整专栏和代码:点击 🏡 博客主页:点击 文章目录 SqlSession 是线程安全的吗?为什么说是线程不安全的?事务管理问题 数据库连接的共享问题 一级缓存线程安全问题…...

Java 8 及经典面试题全解析

Java 是目前非常流行的编程语言之一,其强大的生态系统和丰富的功能使得它在企业级开发中占据重要地位。在面试中,Java 的基础知识、集合框架、多线程、JVM,以及 Java 8 的新特性是重点考查内容。本文将结合 Java 8 和经典知识点,为…...

MySQL:安装配置(完整教程)

这里写目录标题 一、MySQL 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1 初始化 MySQL5.2 启动 MySQL 服务 六、修改 MySQL 密码七、卸载 MySQL八、结语 一、MySQL 简介 MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS)…...

Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析

文章目录 PreApache CommonsApache Commons ProperLogging (Apache Commons Logging ) JCL 集成logbackPOM依赖配置文件 logback.xml使用 源码分析jcl-over-slf4j 的工作原理1. LogFactory 的实现2. SLF4JLogFactory 和 Log 的实例化过程3. SLF4JLog 和 …...

高性能网络框架--fstack

【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 Fstack 是一个高性能的网络框架,主要用于构建高性能的网络应用程序,特别是在处理大量并发连接时。它基于 Linux 的 epoll 机制,使用了多线程和事件驱动的编程模型。以下是对 …...

Unity Mesh生成Cube

1. 配置一个Cube的每个面的数据 一共是6个面,每个面包含的数据包括4个顶点的相对顶点坐标(Cube的中心为原点),法线方向,UV坐标,顶点渲染顺序,以及这个面用到的材质,因为这里是Top&am…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...