作者:陈政德169384 | 来源:互联网 | 2023-09-03 17:58
这篇文章需要一点点机器学习的基础,尽量讲成大白话。 卷积神经网络在当年也算是异军突起,一出现便将各个天梯榜屠的面目全非,今天我们就来聊一下有哪些常见的卷积神经网络结构。至于什
这篇文章需要一点点机器学习的基础,尽量讲成大白话。
卷积神经网络在当年也算是异军突起,一出现便将各个天梯榜屠的面目全非,今天我们就来聊一下有哪些常见的卷积神经网络结构。至于什么是卷积神经网络,你可以参考知乎大神的回答,能否对卷积神经网络工作原理做一个直观的解释。若是这个可以看的懂的话,我再推荐一个更底层一些的,原理上的。 如何通俗易懂地解释卷积?如果这两个都看懂了,那就继续下去看咯,要是没看懂,出门左转,再见了您嘞!
虽然现在的caffe、tensorflow、还有刚出不久的pytorch等都有着比较完善的框架,且有很多的开源软件,但是弄懂底层的一些算法,不管是对于模型自身的提升,还是自身素质的提升都有着很大的帮助的。
开始说正事。
LeNet——1998年,Yann LeCun这个人发表了一篇论文Gradient-based learning applied to document recognition。在文章中,他提出了一个模型LeNet。当时的他为的是解决数字识别的问题,虽然是刚起步的深度学习,但是当今主流框架的东西,比如:卷积层、池化层等它可是都有哦。换句话说,现在的框架都是受他们的影响,前辈还是厉害的。先上图
LeNet一共有7层。
- 输入的是一张32*32的图画。
-
C1 是一个Conv(卷积层),卷积核的大小为5*5,深度为6,没有padding,且Stride(步长)为1,所以C1输出的尺寸是32-5+1=28,深度是6.
-
S2 是一个pooling(池化层),pooling主要有两个方法:一个是Avy Pooling(平均池化),另一个是Max poolling。池化的主要目的是压缩数据处理量、防止过拟合两个作用,当然啦,也要保证数据的信息量。不过由于pooling太暴力,信息丢失量太大,且使用繁琐,因此一些机构开始使用Global Pooling。
-
C3 也是一个卷积层,卷积核大小为5*5,深度为16,no padding,stride=1,因此输出的是一张10*10的feature maps,深度为16.
- S4 是一个池化层,过滤器大小为2*2,stride=2,因此输出的是一张5*5的feature maps,深度为16.
- C5 是一个卷积层(全连接层),卷积核大小为5*5,得到的是一个长度为5*5*16的向量,是一维的。有全卷积层的话,INPUT的画面必须是定尺寸的,为啥?这个你可以参考卷积层与全连接层的区别
- F6也是一个全连接层输出84个节点
- 输出层也是全连接层,输出10个节点。
——————————————————————分割线———————————————————————————
AlexNet——好景不长,LeNet大放异彩不久,AlexNet便横空出事。AlexNet的主要成就在于它的ReLU**函数是非线性的,也就是它不是一个直男,而是一个很感性的人,对数据拟合更加的委婉。它的优秀因为以下几点:
- 使用了Relu**函数,比基于tanh和sigmoid的网络训练快数倍
- 标准化。因为Relu**函数的原因,输出的范围不会有上限,因此你需要做一个normalization(标准化)
- Dropout。字面意思,随机的丢掉一些神经元,这样可以有效防止过拟合,当然了,再性能上一定会有一定的影响,但是比起过拟合带来的麻烦,这样drop drop drop还是很值得的。
- data augmentation(数据增强)。有公开训练集的时候还好说,数据量稳稳的够。但是如果你要实现的效果很奇葩,且没钱,那在有效的范围内测得的数据肯定是不够的。这个时候你就要对数据进行data augmentation,宏观理解就是一幅画,我旋转一下,嘿!他就是新的数据了。也可以是加一点噪声上去,不仅数据量上去了,连模型的泛化能力也蹭蹭蹭上去了呢。手动[doge].先上个图吧(图片我就懒得做了,从左往右数层数)。
AlexNet总共包含8层,其中有5个卷积层和3个全连接层,有60M个参数,神经元个数为650k,分类数目为1000,LRN层出现在第一个和第二个卷积层后面,最大池化层出现在两个LRN层及最后一个卷积层后。 这个数字量,希望你的矿机还好。
需要注意的是,该模型采用了2-GPU并行结构
- 第一层,和你们讲这个图第一层是错的(网上的图就是不靠谱,我也懒的改了),输入的应该是227*227的一个图(而不是224*224),深度为3.卷积核大小为11*11,深度为96。得到一个55*55*96.
- 第二层,将上面的96层分成两部分计算,每一部分深度为48.每一部分进行Max—pooling,过滤器核大小为5*5,padding=2,stride=2,深度为128,池化后两组的输出都是27*27的一张图,深度为128。
- 第三层,再来个max—polling,过滤核大小为3*3,填充为1,步长为2,深度为192,则池化后的结果为13*13*192.
- 第四层,是一个卷积层,在前面的基础上做了一个合并,padding=1,kernel13*13,深度为192,stride=1,输出结果为13*13*192。
- 第五层,卷积操作,没啥好讲的。
- 第六层,卷积操作,也没啥好讲的。
- 第七层,先池化处理,过滤器大小为3*3,步长为2,则池化后的每组输出为6*6*128 ,这里没画出来然后来一个全连接层。这一层的输入为6*6*256,因此需要采用6*6*256尺寸的过滤器对输入数据进行卷积运算,一个过滤器对输入数据进行卷积运算生成一个结果,我们设置了4096个,因此输出长度为4096的一位向量。
- 第八层,稳稳的全连接。
- 第九层,输入4096个,输出为1000个。
——————————————————————分割线——————————————————————————
ZF Net——首先呢,名字是两个人名字首字母拼起来的,没啥意义,纯属表达基情。这是论文,想研究的取瞅几眼可以。此篇文章研究的主要是将训练时候中的数据可视化一下,让你看下,哪里可能出了问题,让人体大脑代替一部分优化工作。比如需要的地方因该是一张大饼脸的图像,结果却是一双手,那肯定后面都得错了,那就应该向前找到出错的地方。里面比较重要的一个废话观点就是:网络深度对模型非常重要。下面是各个层输出的效果图,也算是对深度学习这种黑盒实验做了一些透明度吧。
————————————————————————分割线————————————————————————
VGG Net(Visual Geometry Group)——VGGNet是牛津大学计算机视觉组和DeepMind公司共同研发一种深度卷积网络,并且在2014年在ILSVRC比赛上获得了分类项目的第二名和定位项目的第一名,VggNet一共有六种不同的网络结构,但是每种结构都有含有5组卷积,每组卷积都使用3x3的卷积核,每组卷积后进行一个2x2最大池化,接下来是三个全连接层.在训练高级别的网络时,可以先训练低级别的网络,用前者获得的权重初始化高级别的网络,可以加速网络的收敛(这段是我copy的)。
这个方法主要是为了减少参数量,具体的做法是这样的:如果一个卷积层是7*7,那么这一层就会有49个参数。但是使用3个3*3的卷积核的效果一样,但是参数却只有27个。并且三个卷积,非线性更加的nice啊,对于feature的学习就更加完美了。
至于怎么实现。自己打开google or 百度 一搜一大把。
————————————————————————分割线——————————————————————————
Inception——这么提高神经网络的性能呢?那最方便的手段就是增加深度和网络的宽度,但是哦,一旦增加了这些参数,神经网络很容易过拟合,而且很消耗资源。用专业化的话就是:到将稀疏矩阵聚类成相对稠密子空间来倾向于对稀疏矩阵的优化,因而提出inception结构。说人话就是:怎么用较少的卷积层来起到覆盖整个卷积网络。
他的做法就是:在多个不同尺寸的卷积核上同时进行卷积运算后再进行聚合,并使用1*1的卷积进行降维减少计算成本。在这插一嘴,就是这个1*1的conv在不同的地方使用会有奇效,在实际开发过程中如果遇到测试集OK,但是实际场景却糟糕的情况,可以考虑一下在某些地方加入这个小东西。Inception有许多不同的网络结构从V1到V4,每个结构都有着自己的特色,就不细细再去讲了
———————————————————————分割线——————————————————————————
ResNet——深度残差网络,这个东西有点厉害了,何博士在facebook实习的时候做出来的,直接走上人生巅峰有木有。它所解决的问题是因为当时模型的辨别力竟然会随着深度的加深而发生退化,这怎么可能,就算加一层没有用的,那顶多是效果不变,再怎么也不可能退化。何博士就做了一个重大的决定,就是将上一层计算的结果直接加入下一层,没听错,就是这个加法计算,在代码中甚至只需要一行代码便可以实现,但是它解决了退化问题。
上图是ResNet的设计思路,在实际实现上主要有两种:
一种是identity mapping,另外一个叫residual mapping,要是你的网络浅就去用左边那个,要是够深够长你就去用右边那个。因为右边那个有一个1*1的conv层,它在这是用来减少计算量的。同时这个加法计算时候,万一几个conv出来的东西大小不一样咋整,别想了,人家何博士也帮你想好了,有三种方案
- 输入输出一致的情况下,使用恒等映射,不一致的情况下,则用0填充(zero-padding shortcuts)
- 输入输出一致时使用恒等映射,不一致时使用 projection shortcuts
- 在两种情况下均使用 projection shortcuts
我的建议是你就去用第二种方案,也别多想了。
总结
- 深度越深,越宽效果理论上是一定会更好的。
- 使用多个小卷积核代替大卷积核可以有效降低计算量。
- 加法运算有效解决退化问题。
- 未完待续········