VGG原理与实战

 VGG网络结构

这也更好的块状结构,256个卷积核

 卷积就是我们的一个特征图啊往往都会缩小 ,然后的话但它通道不会变.卷积一般是使用我们的通道C变大,磁化但是它的通道就是我们那个H和W一般都会变小.下采样的意思就是使分辨率变小

  1. vgg—block内的卷积层都是同结构的意味着输入和输出的尺寸一样,且卷积层可以堆叠复用,其中的实现是通过统一的size为3×3的kernel size + stride1 + padding1实现。
  2. maxpool层将前一层(vgg—block层)的特征缩减一半 使得尺寸缩减的很规整,从224—112—56—28—14—7。其中是通过pool size2 + stride2实现。
  3. 深度较深,参数量够大·较深的网络层数使得训练得到的模型分类效果优秀,但是较大的参数对训练和模型保存提出了更大的资源要求。(因为到后面的RESNET的时候,你会发现它解决就是我们模型较深,使我们使我们的效果不好的问题)
  4. 较小的filter size/kernel size **这里全局的kernel size都 为3×3,相比以前的网络模型来说,尺寸足够小。
  5. 你会发现我们的选集都是3×3,3×3有什么好处呢,参数少对吧防止过滤

 参数详解

VGGNet通过在传统卷积神经网络模型(AlexNet)上的拓展,发现除了较为复杂的模型结构的设计(如GoogLeNet)外,深度对于提高模型准确率很重要,VGG和之前的AlexNet相比,深度更深,参数更多(1.38亿),效果和可移植性更好,且模型设计的简洁而规律,从而被广泛使用。还有一些特点总结如下:
1、小尺寸的filter(3×3)不仅使参数更少,效果也并不弱于大尺寸filter如5×5
2、块的使用导致网络定义的非常简洁。使用块可以有效地设计复杂的网络。
3、AlexNet中的局部响应归一化作用不大

VGG代码实战

model.py

import torch
from torch import nn
from torchsummary import summaryclass VGG16(nn.Module()):def __init__(self):super(VGG16, self).__init__()self.block1 = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.block2 = nn.Sequential(nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2),)self.block3 = nn.Sequential(nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.block4 = nn.Sequential(nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.block5 = nn.Sequential(nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1),nn.ReLU(),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.block6 = nn.Sequential(nn.FLatten(),nn.Linear(7 * 7 * 512, 4096),nn.ReLU(),nn.Linear(4096, 4096),nn.ReLU(),nn.Linear(4096, 10),)def forward(self, x):x = self.block1(x)x = self.block2(x)x = self.block3(x)x = self.block4(x)x = self.block5(x)x = self.block6(x)return xif __name__ == '__main__':device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = VGG16().to(device)print(summary(model, (1, 224, 224)))

model_train.py这次训练的结果不是会很好,暴露问题,使用1060训练了332min即5.5个小时

 接下来我们来看一下模型的一个
训练的一个结果啊
呃前面也讲了
这次的训练的结果呢
它不会很好
我们是用来暴露我们的问题了
然后的话根据我们的问题干嘛啊
就是来解决对应的问题嘛对吧
首先我们来看一下就是整个训练的一个过程啊
训练过程是332分钟
也就是将近大概是五个半小时左右嘛对吧
五个半小时左右时间还是很长的啊
20轮五个半小时还是很长的
然后的话我们这个
你其实我们从这个通过什么打印出来
一个训练日志可以发现啊
基本上它的一个什么呃精度都是在0.9左右
也就是在什么啊
0.09左右也就10%左右嘛是吧
然后它的loss值啊
也基本上大概大概在这个值左右吧
基本上是不变的一个过程
而通过我们的图呢也更加直观
他这个精确度呢基本上就在这个附近
然后他那个loss值啊也也也不收敛
也就是这两个loss值和我们精确度都不收敛
额这里我插插一个
就是题外话
当时我在写这段代码的时候
我肯定也做了一些测试嘛
哎当时会出现什么情况呢
我训练完之后呢
诶他出现这个问题呃
我我我检查一下了模型啊
发现的模型好像是吧
没有什么问题啊是吧
我就很苦恼
后面呢就是干嘛
后面过了几天之后
我同样代码我也没有改
我也很忙嘛
我没有改
然后又运行同样的代码
我发现诶他又运行OK了
然后我就一直思考
我到底是不是有人动了我代码
还是我自己就是迷迷糊
不知道
动了代码之后呢
然后运行运行一下代码之后呢
然后呃它就变好了
对不对
就比如我们的精度啊
一直一直上升
可能最后在大概在90%多的准确度
还是蛮蛮不错的
对不对
然后的话那代码我也没动
过几天我又又又重新训了一下
之后发现又又不行了
然后不断的重复又训又重复不训呃
就重复训
然后每次是吧嗯结果都不一样啊
就是比如说训了五次之后
哎呀它的精度都是这样子的
不收敛是吧啊
过了下午的时候呢
或者关关机重启之后呢
可能过了一会儿他又好了
哎那时候我就不知道是什么样的原因
就很疑惑
我当时怀疑是不是环境的问题
问哪个问题啊
终于在后面啊
我终于知道问题出在哪里啊
这里我给大家讲一下啊
首先啊给大家讲个这个知识点啊
首先我们模型搭建
我这里给大家讲一下
肯定是没有问题的啊
这里我可以给大家保证
这里模型搭建肯定是没有问题的
然后的话啊这里给大家讲这个知识点啊
首先我们这个VGG对不对
危机是十六十六个层
对不对
然后的话因为模型啊
它相对于我们前面NSNET和n net
它相对来说比较深
声对不对
那就意味着什么呢
因为你这里输入一个X是吧
输入X
然后这里比如说通过模型
通过模型
通过模型啊
我们打个省略号
通过模型对不对
然后一直到最后的Y对啊
这里肯定是没问题的
对不对
然后的话呢嗯对的话
你最好还能得出我们的loss值
你通过loss值不断的去反馈过来是吧
去更新我们的一个什么W的
对不对
然后我们前面也也知道
我们W更新应该是什么样子的
应该是这样的
对不对是吧
这里是我们的什么loss值的函数
然后对对什么对我们的W是一个什么
是求导的过程
事实上你你会发现随着网络越越来越深啊
随着网络越来越深
你其实你很容易出现什么
前面我也讲过
也容易出现什么梯度消失这种问题
就消失或者梯度爆炸
这个问题导致你的W更新之后
其实事实上效果不会很好
或者直接就不收敛了
不收敛对不对啊
不收敛啊
直接就不收敛
因为什么呢
因为你这里链式求导嘛
你比如说打个简单
比方你你你你的你的一个loss值对什么
对我们的一个你的loss是对什么
对我们的W进行求导
事实上它是这样子的
他可能对A函数求导
A函数又是B函数的导数
是吧啊
B函数可能是C函数的导数
C函数可能是D函数的导数
对不对
然后D函数
D函数可能才是W的函数的导数
事实上嗯这个还是少的
可能就五层
事实上你想象一下就是五层十层是吧
呃可能十几层他可能就是越来越深了嘛
越来越深的话
你会发现你会发现
就是如果你你你你链式求导的话
你这里导数假设是很小的话
你这里也很小
你这里也很小
你这小这里也很小的话就会导致什么
你这里这个值趋近于零嘛
就问你这里减跟没减它不是一样的吗
你W就会不更新
对不对
然后的话然后的话往往往往会出现什么情况呢
就是因为一开始是随机的嘛
应该是随机的
对不对
一开始随机会出现什么过大或过小
过大或过小的这种情况是吧
前面我们在讲我们那个什么原理的时候
再讲深度学习那个呃前面那个基础知识的时候
我们前面也讲了嘛
就是我们前面用一个案例去计算什么
梯度下降法
就是反向传播这样的过程嘛
当时的话我们W啊是吧
我们一个初始化的值
比如说等于一
那假设你初始化值可能等于一个过大一个值
你你去比如说你这里啊过大值是吧
事实上真实值最优的值可能是
假设我们W初始值是100上
最优的值可能是什么
是0.1
有可能吧
然后的话你这里啊你正常
哪怕你正常更新的情况下是吧
正常更新的情况下
它会导致什么
你最后你其实你更新完之后
你可能再乘个学习率之后
你这里相当于减一个0.0001
对不对
有这种可能吧
有可能吧
你讲完之后呢
事实上你0.001和什么和99.9
9999几乎上没什么区别嘛
但你最优的一个什么W
应该是在这个区域嘛对吧
所以说最后导致你嘛模型它不收敛
事实上我们希望什么
事实上你其实你的一个码
你随机初始就是你的你W1开始随机随机
随机随机什么赋值的时候
你不应该这么这么这么这么这么这么随便
对不对
所以的话就是我们会有什么
会有一个就是随机初始化的一个方法是吧
来来给你们再再再么在训练我们模型之前
我们把我们把我们W按照一定的方式是吧
按照一定的方式去初始化
按照一个方法去初始化哎
让他不至于这么离谱吗
明白我意思吧
而且因为W会乘上乘上我们对应的X
它会经过什么
经过我们的激活函数
比如六激活函数啊
或者什么SM的激活函数啊
事实上在有时候
这六激活函数或者single mode激活函数啊
它在某个区间内它在什么导数是怎么说呢
或者趋向于趋向于零的
对不对是吧
或者比如说我们LOL函数
直接就是这样一个分段函数
在这个区间内
在这个区间它是没有没有导数的
对不对是吧
如果你的值所以就落在这里的话
你就不更新了呀
对不对
我们可能希望这个值可能落在这个附近
在某个值的时候它不更新啊
再有的只是它更新
对不对
这样我们希望这样子的吧
如果你这个W乘以X的值全部落在这个地方
那那你就全部去按零
它直接不更新了呀
那你W减去最后减去了W等于什么
等于减去一个几乎接近于零的一个数
他就不更新了吗
那最后你等于什么
你的loss值
你的loss是肯定是不会下降的呀
最后你的精确度也也不会上升的呀
明白我的意思吧
所以其实就是有这样的一个方法来干嘛
来初始化我们的W这样子怎么干嘛
就使我们最后的一个更新的速度
第一个可能会变快
第二个什么不至于像刚刚那样不收敛啊
所以的话当时啊就是在写这段代码的时候
我没有加上了
加上一个
这就是我们权重初始化这个这一项导致什么
导致我们模型在训练的时候诶
他好像什么就是一直不收敛是吧
然后的话就又又前面也讲了
那可能过一段时间之后
我再重新运行这段代码的时候是吧
哎可能当时他的因为权重是那个W是随机的嘛
W随机的话可能恰好诶是吧
恰好这一组WA比较接近我们真实值
这组W比较接近我们的真实真实W对不对
哎那可能更新很快就更新好了是吧
所以就会导致什么呢
每一次更新之后是每一次运行
可能过五次运行它不收敛
可能第六次他又收敛了
所以当时就让我很苦恼啊
所以啊所以当我加了什么
加上我们一个什么啊
权重初始化的一个什么方法之后
初始化啊
初始化复制这个方法之后呢
哎基本上你在什么在我们那个运行之后啊
他的一个什么就是结果是很稳定的啊
基本上就是呃大概十轮二轮之后
他就基本收敛了
所以的话接下来我们来看一下
就是既然我们权重是需要初始化的对吧
我们权重是需要初始化的

那我们用代码怎么去
怎么去初始化我们那个权重啊
这里面还讲一下
其实你会发现我们那个ALICENE和我们的net
他当时是没有初始化这个选项的
呃我思考了一下
可能因为这个这个权重啊
这个这个这个模型它不够那么深
所以的话呢可能全都在在在我们什么随机随机
什么随机进行什么啊
进行一个复制之后
然后进行更新
它也是OK的
明白我意思吧
事实上在alex net我也出现过什么
就是当时没有权重初始化是吧
然后我运气说哎发现他也没收敛
有用这种情况
但基本上我基本上每次运行这个ANNASNET的时候
它的效果都是还是OK的
正常都会都会训练的
但是呢随着网络越来越深
比如说我们什么VG啊
后面讲的google
后面讲公开的
它都是需要什么权重知识化的
否则很容易出现什么
很容易出现A你你你你你你你运行
然后的话可能二轮他都不收敛啊
loss值也不下降是吧
我们那个精度也不上升这种情况啊
所以的话这一点我们先讲一下
这个就是我们什么权重初始化
怎么在代码当中加上一个权重初始化
这个方法使我们权重啊
更符合我们真实的实际情况啊
好吧
接下来我们来赚钱
我们这个定义的代码

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

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

相关文章

vite学习教程04、vue集成axios封装request工具类及应用

文章目录 前言1、安装axios2、封装request工具类3、封装api请求工具4、实战:vue中使用api请求工具类资料获取 前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技…

k8s 中存储之 hostPath 卷

目录 1 hostPath 卷介绍 2 hostPath 卷实际应用操作 2.1 创建 pod 资源类型 2.2 修改清单文件增加 hostPath 对应的参数配置 2.3 查看是否创建 卷 和 pod 2.4 创建发布文件测试是否正常访问 1 hostPath 卷介绍 EmptyDir中数据不会被持久化,它会随着Pod的结束而销…

【数据结构】【链表代码】随机链表的复制

/*** Definition for a Node.* struct Node {* int val;* struct Node *next;* struct Node *random;* };*/typedef struct Node Node; struct Node* copyRandomList(struct Node* head) {if(headNULL)return NULL;//1.拷贝结点,连接到原结点的后面Node…

【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段

文章目录 【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段1 问题由来2 操作流程步骤1:打开代码片段定制页步骤2:在新标签页输入定制 XML步骤3:保存定义内容步骤4:功能测试 3 拓展 【工欲善其事】巧用 Sublime Text 生成带…

【Python】wxPython 高 DPI 缩放问题(笔记本上字体模糊问题)

问题 使用 wxPython 编写的程序在某些高 DPI 的电脑(通常是笔记本)上显示出来的字体会非常模糊: 事实上 wxPython 是支持高 DPI 的,但是由于我们的程序没有显式指明支持高 DPI,因此系统默认不支持高 DPI,…

【C++驾轻就熟】vector深入了解及模拟实现

​ 目录 ​编辑​ 一、vector介绍 二、标准库中的vector 2.1vector常见的构造函数 2.1.1无参构造函数 2.1.2 有参构造函数(构造并初始化n个val) 2.1.3有参构造函数(使用迭代器进行初始化构造) 2.2 vector iterator 的使…

【GC日志和OOM日志分析】JVM GC日志和OOM Dump文件分析

1 缘起 充电、充电、充电。 增加一些必备的知识,帮助后续使用。 2 配置JVM参数 为分析GC日志以及OOM相关信息,配置JVM参数,分为三个部分: (1)堆内存,包括年轻代、最大堆内存; &a…

VUE 开发——Node.js学习(一)

一、认识Node.js Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序 使用Node.js编写服务器端程序——编写数据接口、前端工程化; Node.js环境没有BOM和DOM; Node.js安装:下载node-v16.19…

深度学习----------------------注意力机制

目录 心理学不随意线索随意线索 注意力机制非参注意力池化层Nadaraya-Watson核回归参数化的注意力机制 总结注意力汇聚:Nadaraya-Watson核回归代码生成数据集核回归非参数注意力汇聚注意力权重该部分总代码 带参数的注意力汇聚将训练数据集转换为键和值训练带参数的…

[Linux] 进程创建、退出和等待

标题:[Linux] 进程创建、退出和等待 个人主页水墨不写bug (图片来源于AI) 目录 一、进程创建fork() 1) fork的返回值: 2)写时拷贝 ​编辑3)fork常规用法 4&#xff…

线性代数书中求解齐次线性方程组、非齐次线性方程组方法的特点和缺陷(附实例讲解)

目录 一、克拉默法则 1. 方法概述 2. 例16(1) P45 3. 特点 (1) 只适用于系数矩阵是方阵 (2) 只适用于行列式非零 (3) 只适用于唯一解的情况 (4) 只适用于非齐次线性方程组 二、逆矩阵 1. 方法概述 2. 例16(2) P45 3. 特点 (1) 只适用于系数矩阵必须是方阵且可逆 …

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Leecode热题100-560.和为k的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2: 输入:nums [1,2,3], k…

五、类与对象包访问权限

类与对象&包&访问权限 类的定义类的概念定义和使用类对象的初始化类的成员函数 再谈基本类型运算符重载函数中缀函数空值和空类型解构包和导入访问权限控制内部类 类的定义 在之前,我们一直在使用顶层定义: 在Kotlin中,顶层定义&…

计算机网络:计算机网络概述 —— 网络拓扑结构

文章目录 网络拓扑总线型拓扑特点缺陷 星型拓扑特点缺陷 环型拓扑特点缺陷 网状型拓扑优点缺陷 树型拓扑特点缺陷 网络拓扑 网络拓扑指的是计算机网络中节点(计算机、交换机、路由器等)之间物理或逻辑连接的结构。网络拓扑定义了节点之间的布局、连接方…

基于ssm 框架的java 开发语言的 在线教育学习平台系统设计与实现 源码 论文

博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…

【高等数学学习记录】函数的极限

一、知识点 (一)知识结构 #mermaid-svg-Dz0Ns0FflWSBWY50 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Dz0Ns0FflWSBWY50 .error-icon{fill:#552222;}#mermaid-svg-Dz0Ns0FflWSBWY50 .erro…

ROW_NUMBER

How to rewrite a query which uses the ROW_NUMBER() window function in versions 5.7 or earlier before window functions were supported e.g., SELECT ROW_NUMBER() OVER (PARTITION BY fieldA) AS rownum, myTable.* FROM myTable; index 用不上的 Solution Assuming…

保姆级手把手使用YOLOv11训练自己数据集(含源代码、网络结构、模型检测和转换 、数据集查找、模型训练)

文章目录 前言项目地址项目内容:网络模型结构性能测试任务描述任务内容 项目运行模型训练 前言 本教程内含YOLOv11网络结构图训练教程推理教程数据集获取等有关的内容~ 项目地址 YOLO11是Ultralytics YOLO系列实时目标检测器的最新迭代版本,它以尖端的…

打卡第三天 P5729 【深基5.例7】工艺品制作

今天是我打卡第三天&#xff0c;做个入门题吧(#^.^#) 原题链接&#xff1a;【深基5.例7】工艺品制作 - 洛谷 题目描述 输入格式 输出格式 输出一个整数表示答案。 输入输出样例 输入 #1 4 4 4 1 1 1 1 2 2 2 输出 #1 56 说明/提示 C&#xff1a; #include<bits/std…