神经网络-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…...
OpenClaw技能扩展:千问3.5-35B-A3B-FP8驱动的内容生成与发布
OpenClaw技能扩展:千问3.5-35B-A3B-FP8驱动的内容生成与发布 1. 为什么选择OpenClaw千问3.5做内容自动化 去年冬天,当我第一次尝试用AI自动化完成公众号内容生产时,经历了典型的"缝合怪"工作流:ChatGPT生成初稿→Midj…...
RAGFlow与Dify共存方案:同一台Win11机器如何用Docker隔离部署
RAGFlow与Dify共存方案:同一台Win11机器如何用Docker隔离部署 在AI应用开发领域,RAGFlow和Dify作为两款热门工具,分别擅长知识库构建和AI应用编排。许多开发者面临一个现实挑战:如何在本地开发环境中同时运行这两个系统࿱…...
Pixel Aurora Engine应用场景:独立开发者低成本构建像素IP资产库
Pixel Aurora Engine应用场景:独立开发者低成本构建像素IP资产库 1. 像素艺术创作新纪元 在游戏开发领域,像素艺术始终保持着独特的魅力。从早期的《超级马里奥》到现代的《星露谷物语》,像素风格游戏凭借其怀旧感和艺术表现力,…...
CMake 导言
为什么选择 CMake 在掌握 Linux 基础后,我们知道一个项目通常由多个源文件组成。想要构建这个项目,就需要按照一定的规则对源文件进行编译和链接,而这些规则通常需要在 Makefile 中定义。 但随着项目体量增大,手写 Makefile 会变得…...
Arduino嵌入式SD卡逐行读取库ReadLines详解
1. 项目概述ReadLines 是一个专为 Arduino 平台设计的轻量级文件行读取库,核心目标是解决嵌入式系统中对 SD 卡文本文件进行逐行解析这一高频但易出错的操作需求。在资源受限的 MCU 环境下(如 ESP8266、STM32F103C8T6、ATmega328P)࿰…...
新手福音:用快马生成你的第一个c盘自动清理python脚本
今天想和大家分享一个特别实用的Python小工具——C盘自动清理脚本。作为一个刚接触编程的新手,我发现清理C盘空间是个常见需求,但手动操作既麻烦又容易误删重要文件。于是我用InsCode(快马)平台生成了一个简单实用的脚本,整个过程特别适合编程…...
基于S7-200 PLC与组态王技术的温室大棚控制方案:包含梯形图原理图、IO分配及组态画面详解
基于S7-200 PLC和组态王温室大棚控制 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面菜农张叔上周还给我打电话吐槽:“小王啊,上周那场降温加突然转晴,我三点爬起来盖半层棉被…...
GLM-OCR完整教程:部署、使用、API、案例,一篇搞定所有
GLM-OCR完整教程:部署、使用、API、案例,一篇搞定所有 1. GLM-OCR简介与核心优势 GLM-OCR是一款基于先进多模态架构的OCR识别工具,专为解决复杂文档理解问题而设计。与市面上大多数OCR工具不同,它不仅能识别文字,还能…...
时间/金额转换
公式:大头 总数值 / 限制(除数)剩余 总数值 % 限制(除数)例如要将95分钟拆成小时分钟的形式60分钟1小时,那么这60就是限制小时 95 / 60分钟 95 % 60...
Phi-3-mini-4k-instruct-gguf实战案例:用轻量模型替代Llama3-8B做高频短任务降本
Phi-3-mini-4k-instruct-gguf实战案例:用轻量模型替代Llama3-8B做高频短任务降本 1. 为什么选择轻量模型 在AI应用落地的过程中,我们常常面临一个困境:大模型效果虽好,但部署成本高、响应速度慢。特别是在处理大量高频短任务时&…...
