网站首页 > 精选文章 正文
W和H表示输入的宽度和长度,W2和H2表示输出特征图的宽度和长度,F表示卷积核长和宽的大小,S表示滑动窗口的步长,P表示边界填充。
H和W计算方法都是一样的,H2表示得到的结果,H1表示原始的输入,F表示feature size。
比如卷积核大小是3x3,此时FH=3,FW=3。
P表示加几圈0 比如加一圈就是加上2x1
上边加一层,下边加一层,左边加一层,右边加一层。所有的H和W都是2xP即上下左右都翻2倍的意思。
S是步长,S越小特征提取越丰富,S越大特征越少。
如果输入数据是32x32x3的图像,用10个5x5x3的filter来进行卷积操作,10个filter可以得到10个特征图,指定步长为1,边界填充为2,最终的输出规模是?(32-5+2x2)/1+1=32 所以输出规模是32x32x10,经过卷积操作后也可以保持特征图长度和宽度不变。计算完之后,卷积特征图大小不一定变小,保持不变也是可能的。
卷积核的channel和原始输入的channel是一样的。
所需的权重参数有多少个呢?
5x5x3每个卷积核需要75个参数,有10个不同的卷积核,就需要10x75=750个卷积核参数,不要忘记还有b参数,每个卷积核都有一个对应的偏置参数,最终只需要750+10=760个权重参数。
卷积参数共享
如图是一个3x3卷积核中的值,对图像当中的每个区域做卷积,对于不同的区域选择的卷积核中的每个值是不同的,这样才能做的更好。
如果每个区域都选择不同的卷积核去做,总共的权重参数就太多太多了。
传统的神经网络就会存在这个问题,就是参数太多,比如784x784就是一个非常大的权重参数。
参数多会导致这样几个问题:1、不好训练 2、训练比较慢 3、过拟合风险比较大。
而卷积神经网络就解决了这样的问题:通过参数共享的方式。
比如当前有了这样一组卷积核,用这样一组核对每个区域做特征提取的时候,卷积核里面的值都是一样的。
这是第一个区域对应的一组卷积核参数
第二个区域还是对应这样一组卷积核参数
第三组区域对应的卷积核参数还是一样的,这就是卷积参数共享了,对其中每个位置都是选择相同的卷积核。
执行一次卷积需要多少个参数
784x100,做一次全连接就需要7万多参数。卷积核自身有75个值,代表75个参数,10个不同的filter,每个filter中的值是一样的,但是同一个filter,在图像当中任何区域都是共享的,所以参数个数为75x10=750。10个filter得到10个不同的特征图,对每个特征图进行微调的过程中都需要一个偏置参数,最终总共需要的参数个数为760。涉及到的参数比较少就容易训练。
池化层
224x224x64表示长224,宽224,channel是64,一次卷积可以得到64个特征图,这么多特征,不一定都非常重要,而池化层是做压缩的,也叫下采样。上图做了压缩之后,H和W都变为了原来的1/2,体积变为了原来的1/4。有选择性的压缩,重要的留下,不重要的丢弃。
怎么选择的
框一个区域,从中选择一个值。
依次类推,可以框4个2x2的区域,每个区域选择一个值,共选出了4个值。
指定一种方法,在原始得到的特征基础之上,进行筛选。把原始的输入数据,只会变长和宽,不会变channel即特征图的个数不会变。只能做缩减,不能修改特征图的个数。
对4x4x1的某一个特征图做max pooling,4个2x2的区域,每个区域选择一个最大值,该过程并没有计算,只是做了一个筛选而已。
为什么选择最大值
神经网络在计算的过程中,如果选择最大值代表这个结果比较重要,因为权重参数是不断改变的,一旦通过权重参数计算完之后,得到的特征值比较大,相当于整个网络认为它是比较重要的,max pooling只选择大的,表示只挑重要的。
还有一个就是avg pooling就是平均值化,上图中红色区域的平均值就是 (1+1+5+6)/4,但现在已经很少见了,max比avg的效果要好的多。
整个卷积神经网络是怎样运行一个实际任务的
输入一张汽车的图片数据,先通过卷积CONV进行一次特征提取,每个卷积层后面都有一个RELU激活函数对特征图做一次变换,这个和传统的神经网络都是一样的。2次卷积之后,进行一次池化,执行完卷积之后,得到比较大的特征图,然后做一次池化压缩POOL。比如得到一个32x32x10的特征图,这个特征图是立体的,在这个特征图当中,怎样对它进行一个分类任务,怎样把这个立体的特征图转换成概率值呢?前面的卷积和池化只是做特征提取得到特征图,最后想得到一个结果,还得靠全连接层FC。而全连接层的矩阵大小是多少?因为是5分类,所以矩阵中的第二个值是5,FC这层连接前面提取出来的特征,但是对于连接层不能连三维的数据,需要把之前提取出来的三维的32x32x10这样的一个特征图,拉成一个非常长的特征向量,这个特征向量是32x32=1024,再乘以10,所以全连接层的矩阵是[10240,5],把1024个特征转换成预测的5个分类别的概率值。所以最后一步POOL层和FC层之间,正常情况下还有一个拉长的操作,把一个特征图拉成一个特征向量,就是把所有结果都总结在一起。用全连接层得到最终的分类结果,这个就是它整个的生命周期。
里面有多少层?
带参数计算的才叫做一层。卷积层(内积、b)是一层。RELU层没有参数计算,即没有权重参数也没有偏向参数,激活层不需要反向传播更新数据。池化层没有w、b也不需要反向传播更新数据。全连接层有权重参数矩阵,需要计算,算一层。所以上图总共有7层的神经网络。整体的网络基本上所有的网络架构大部分情况下都长这个样子。
特征图的变化
一开始拿到输入数据,几个batch就不管了,比如一开始是32x32x3的,实际写代码的时候,它其实是4维的(比如10x32x32x3,10表示batch)。经过卷积完之后,特征图个数明显增加。池化之后,正常情况下,体积变为原来的1/4。卷积核的个数自己设置,可以由多到少,可以由少到多。再之后就是转换,把长方体或立方体转换成一条向量,向量才能连接全连接层,最终得到分类的实际结果。
经典网络Alexnet
这是12年比赛夺冠的网络,现阶段来看这个,效果就不太好了。
卷积核的大小是11x11,大刀阔斧的提取特征。卷积核越小越好,3x3的比较多。
stride 4表示步长为4,不常见。
padding为0也不常见。
这是一个8层的网络,5层的卷积,3层的全连接。
经典网络Vgg
红色框起来的是vgg的几个主流的版本。所有的卷积核大小都是3x3的,意味着都是细粒度进行特征提取。vgg主流的层数是16和19层。
conv3-64 其中64的意思是得到64个特征图。
经过一次pooling之后,会损失一些特征信息,体积会变为原来的1/4,vgg网络经过每一次pooling之后,它的损失信息怎么弥补过来呢?它会在下一次卷积过程中,试的特征图翻倍,相当于用特征图的个数来弥补长、宽的一个损失。
Vgg和Alexnet比较
同一个任务,比如表情的分类任务,10分类,在什么参数都不调,只把网络模型改变一下,Vgg效果比Alexnet的准确度要高15个百分点。
Alexnet训练时长8小时左右,Vgg训练时长大概3天。
训练时间以天为单位,而不是以小时为单位,用GPU跑3/4天都是比较常见的。
Vgg比Alexnet更深一些,而且卷积的幅度更细致,用更深的网络去提取原始数据中的特征,层数越多效果越好。
深层网络遇到的问题
Vgg 16层效果要比30层效果要好。所谓的深度学习从本质上讲越深越好,14年发现这个现象后,达到20层之后,效果反而不太好了。理论上可以达到更高的层,但实验上20层之后的效果不太好了。因为随着卷积层不断增加的时候,不一定所有的卷积层做的效果都好,因为它是在之前特征的基础之上再去提取特征,不一定能保证比之前的效果好。15年低有了一解决方案。
残差网络Resnet
Vgg上56层效果比20层效果的错误率要高,无论在训练还是测试上,从20层增加了36层到56层
,中间肯定有学的不好的,所以它把整个成绩拉下来了。既要堆叠层数,还不能让那些比较差的影响了效果,
比如招募36个人,需要一个选拔的过程,能给这个网络起到促进作用的就招聘你,不能促进的,就不要。但是在这里怎么办呢,因为层加进来,就必须得有,不能丢掉。
加进来一层, 虽然不能剔除掉,但是希望加进来之后,即使表现的不好,把权重参数设为0就好了,为0相当于加进来,不用这一层。
在继续堆叠的过程中,如果发现B不好了,把B层去掉,B层后面的就连接不上了。
这时需要分两条路,一条路走卷积,另一条路把A拿过来让C能连接到。
相当于不带B玩了。
x表示20层之后的某一层输入数据。
运行一次卷积,再运行一次卷积,进行2次卷积之后,得到的结果可能不好。再额外的连接一条线,原封不动的,把x拿过来,进行堆叠(加法操作),这样不光有之前卷积的结果,还有同等映射直接拿过来的x数据,如果这一层做的不好,还有x数据保底。
当神经网络发现图中第2层网络的loss值始终上升,神经网络会把这层所有的权重参数设置为0,因为这层怎么学都学不好,相当于这层白玩了,白玩至少不会比原来的效果差。
传统网络和残差网络比较
上图左边是传统的神经网络比如Vgg,层数越高,错误率越高。右边是残差网络,层数越高,错误率反而降低。残差网络把深度学习给救活了。1000层效果不会比原来差,但提升也提升的比较少。
首选残差网络,因为它在竞赛当中是被证明过的,在学术界都是公认的效果比较好的网络,要做多少层网络,每一层参数怎么设计,这根本不用自己操心的。在做实际问题当中,根本不需要设置什么,拿经典网络框架去用就可以,因为你不可能用1、2年的时间去尝试各种各样的参数,用最经典的,别人实验上千次的结果去做,肯定没有问题。但特殊任务除外,可能会修改一些细节。
Vgg和Resnet都是不错的,Resnet更主流些,上图左侧显示ResNet的错误率更低,ResNet效果得到了一个明显的提升。建议把ResNet这个网络理解为特征提取,不建议把它作为一个分类网络,因为一个问题是分类还是回归,取决于你的损失函数,还有最后一层是怎么连的,所以说把Resnet当作一个特征提取,可用于各种各样的框架中,物体检测、物体追踪、分类、识别、检索,什么任务都能用,相当于通用的网络结构,比较常见的层数是50层、101层。
猜你喜欢
- 2025-05-25 人工智能-深度学习-神经网络结构MLP,CNN,RNN,LSTM
- 2025-05-25 图像识别与卷积神经网络
- 2025-05-25 YOLO-TLA:一种基于 YOLOv5 的高效轻量级小目标检测模型
- 2025-05-25 码农必须了解的5种神经网络架构
- 2025-05-25 深度学习基础知识题库大全
- 2025-05-25 智能图像识别初探系列(三)
- 2025-05-25 汇总|实时性语义分割算法
- 2025-05-25 彻底了解卷积神经网络CNN(二)
- 2025-05-25 深度学习图像分割:网络结构设计一览
- 2025-05-25 Day81:Global Average Pooling全局平均池化
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)