特征提取模型系列之CNN设计

引言与一些定义

对看过的一些关于CNN(卷积神经网络)的论文的一个总结,看的论文不多所以内容可能没多少,以后有新的内容会不断加上去,有不正确之处或不同看法之处欢迎指出。
为了方便下面说明,先定义一些名词:

  • 层:像卷积层,全连接层,批归一化层等等就叫做CNN的 层

  • 模块:由一种或多种层的若干数量的堆砌,比如像Inception

  • CNN的微观结构与宏观结构:CNN的设计可以看作是先设计基本的模块,然后将各种模块以一定结构堆砌连接,模块内部的设计叫做微观结构(microarchitecture),比如决定模块内部的各种层的选择和堆砌顺序等;如何用模块来组成CNN的整体结构的设计叫做宏观结构(macroarchitecture),比如像模块如何连接,网络的深度等。

CNN的微观结构

  • VGG模块:
    主要想法是尽量用3x3的卷积核,具体做法是用两个连续的3x3的卷及核去代替1个5x5的卷积核,同理也可以用3个3x3的卷积核去代替1个7x7的卷积核,如此类推。这样子做的好处是有相同的感受野的同时却只需要更少的计算和参数,而且还有更多的非线性性。

  • bottleneck(图片来自https://zhuanlan.zhihu.com/p/28749411):
    这里写图片描述
    如上图中第二种所示,先用1x1的卷积层降维,然后3x3的卷积,然后再用1x1的卷积升维。比起单个3x3的卷积层,感受野是一样大的,但用的超参数少了,非线性性多了,但由于第一层有降维操作,可能会对结果有影响。这种模块不适合在一开始就用,比较适合在CNN的中间部分用。同样可以在两个1x1的卷积层中间使用2个3x3的卷积层来代替VGG模块。

  • Inception(图片来自googLenet的几篇论文,不写具体链接了,一百度应该就有一堆):
    这里写图片描述
    这里写图片描述
    这里写图片描述
    引入更多的分支,分支作用在于加入各种不同的感受野。参数更少,感受野更多,非线性性更多。用1xn和nx1的卷积核去代替nxn的卷积核的想法也很奇妙。

  • 压缩模块(图片来自论文:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size):

这里写图片描述
类似于是inception和bottleneck的结合(压缩层->bottleneck,扩展层->inception),先用了1x1的conv降维(压缩层),再分不同的感受野分支(扩展层),相对而言增加了非线性性,扩展层的不同分支中1x1的卷积层占了较大一部分,因而参数也会相对较少。

  • 位敏得分模块(图片来自论文:R-FCN: Object Detection via Region-based Fully Convolutional Networks )
    这里写图片描述
    卷积层是具有平移不变性的,但在某些应用中比如物体检测中,是需要卷积层具有平移变换性的,位敏得分模块的存在强调了对位置信息的关注。

  • SE模块(图片来自论文:Squeeze-and-Excitation Networks)
    这里写图片描述
    这里写图片描述
    这里写图片描述
    传统的卷积对特征图的每一个通道都是等同看待的,而SE模块对不同通道赋予不同的权重。

  • 深度可分离卷积模块(图片来自论文:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Appilcation)
    这里写图片描述
    传统的卷积都是感受域和深度同时进行,而深度可分离卷积将这两部分分开进行,先进行感受域的卷积,这也就意味着输入的数据深度有多少就有多少个卷积核,然后再对它们得到的结果用1x1的卷积核进行卷积(也就是进行深度的卷积),这样子的好处是能大大减少参数。

CNN的宏观结构

  • 旁路结构:
    是指一个模块的输入可以连接到另一个模块的输出,旁路可以简单(直接就一条线),也可以复杂(旁路上有一些卷积层)。比如像残差结构用的就是简单的旁路。
    旁路结构一种直观上的理解是能让信息更灵活地流动,前向传播时低层的特征能通过旁路与高层的特征一起被利用,反向传播时梯度也能从高层通过旁路直接流到低层,使得低层获取到的梯度不会太小,从而让参数的学习得以进行。
    旁路结构的另一个比较合适的解释是来自论文:Residual Networks are Exponential Ensembles of relative shallow network(图片来自论文,里面是针对残差网络来解释的)
    这里写图片描述
    论文提出了几个比较重要的看法:(1)残差网络并不是一个单一的深度网络,而是由指数级数量的网络的集成 ;(2)这些集成的网络中真正起作用是一些浅层网络。对于(1),论文作者通过在删除网络的部分模块以及重组部分模块来验证想法,对于(2),论文作者通过统计各种网络贡献的梯度以及训练时只训练浅层网络的方法来验证想法。
    类比着,我个人觉得旁路结构的存在也类似地为网络增加了潜在的集成性,而集成性的存在一是有利于信息(e.g.梯度)的流动,二是能够缓解过拟合。
    旁路结构多种多样,比如像:
    <1>残差网络
    这里写图片描述
    <2>密集网络(图片来自论文:Densely Connected Convolutional Networks)
    这里写图片描述

  • 分层结构(图片来自论文:FractalNet: Ultra-Deep Neural Networks without Residuals):
    这里写图片描述
    旁路结构隐式地增加了网路的集成性,而分层结构则是显示地将集成性表达出来,应该可以说旁路结构是分层结构的特殊情况。
    分层结构的存在能让CNN的效果会随着网络深度的加深而不断变好(集成的角度看)。与drop-path相结合可以让学到的特征更具有鲁棒性。

  • 关于深度和卷积核的通道数那些在下面的设计模式里有涉及,这里就不再说了。还有就是不管是Incenption里的多分支还是旁路结构以及分层结构里的集成观点,都是分支,有分支就有汇总,汇总的方式主要有求和(resnet)|求平均(fractal net)|级联(googLenet)|求最大值 etc,下面的设计模式里有涉及这些方法的讨论。

启发式的设计模式

(论文:Deep Convolutional Neural Network Design Patterns)
这篇论文里讲的主要是设计CNN时的规律和经验法则,我根据自己的理解把里面讲的14条设计模式分为 设计前要考虑的微观结构相关的宏观结构相关的 三部分。

设计前要考虑的

  • Architectural Structure follows the Application: 结构遵循应用
    对有某些任务,一些特定的网络结构可能会效果更好,因此要先考虑应用场景是如何,是否有哪些网络结构在这些任务上能够表现地更好。

  • over-train:在一个更难的问题上训练从而提高泛化能力
    e.g.
    正则化:在要求训练误差低的同时还要求模型尽可能简单
    噪音的使用:理想的数据中没有噪音,但现实中的数据中往往存在噪音,往样本中加入适度的噪音(e.g.dropout)会让任务更加难,但最后效果会更加好

  • cover the problem space:覆盖问题空间
    尽量让训练样本在总体的所有可能取值的地方都有采样到。
    e.g.数据增强

微观结构相关的

  • Proliferate Paths:扩增路径
    e.g.
    inception:多种感受野相结合
    fractal:多种深度相结合

  • Summation Joining:求和式连接
    连接多分支时采用求和或者求平均。

  • Down-sampling Transition:下采样转换
    对于会下采样的层,用级联来链接各分支从而达到增加输出数量会更合适

  • Maxout for Competition:用maxout来连接分支从而有竞争的作用
    when each branch is composed of different sized kernels, Maxout is useful for incorporating scale invariance in an analogous way to how max pooling enables translation invariance.(论文中的原话)

宏观结构相关的

  • Strive for Simplicit:尽量简洁
    使用尽量少的模块和让网络整体结构尽可能简单

  • Increase Symmetry:增加对称性
    对称性认为是漂亮和质量的特征

  • Pyramid Shape:金字塔形状
    最大化表征能力和消除冗余与非判别信息 之间的权衡
    e.g. downsample的同时增加输出通道数

  • Incremental Feature Construction:增量式特征构造
    e.g 加入旁路

  • Normalize Layer Inputs:标准化层输入
    e.g. batch normalization

  • Input Transition:输入转换
    将第一层的输出加倍到3的倍数

  • Available Resources Guide Layer Widths:可用的资源决定层数的深度和宽度
    根据内存和计算资源以及想要的准确率来选择第一层的输出数量 ,CNN的深度等

总结

总结一下,不管是CNN的宏观结构还是微观结构,可以把它们分成两大类,一是提升模型效果的,二是压缩模型(减少参数)。
提升模型效果的有:VGG模块,Inception,位敏得分模块,SE模块,旁路结构,分层结构
压缩模型的有:VGG模块,Inception,bottleneck,压缩模块,深度可分离卷积模块

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用CNN卷积神经网络模型对图像进行特征提取是计算机视觉中的一个重要应用。下面是一个基本的流程: 1. 数据集准备 首先,我们需要准备一个包含标注好的图像数据集。通常情况下,这些图像会被分为训练集、验证集和测试集。 2. 搭建CNN模型 我们需要根据问题的需求,选择一个合适的CNN模型,比如AlexNet、VGG、ResNet等等,并根据数据集的大小和图像的复杂程度,对模型进行微调。 3. 卷积层 卷积层是CNN模型的核心组成部分。它通过滑动窗口的方式,对输入图像进行卷积操作,提取图像的特征。卷积运算之后,通常会进行非线性激活(比如ReLU)和池化操作,以加强特征的表达能力和降低计算复杂度。 4. 全连接层 在卷积层之后,我们需要将提取出来的特征进行分类或者回归等任务。这时候,我们可以添加一个或多个全连接层,将特征映射到目标类别或者数值空间中。 5. 模型训练 训练CNN模型通常需要使用反向传播算法和优化器,以最小化预测误差。在训练过程中,我们可以调整模型的超参数(比如学习率、批次大小、迭代次数等),以提高训练效果。 6. 特征提取 经过训练后,我们可以使用训练好的CNN模型来对新的图像进行特征提取。具体方法是,将新的图像输入到CNN模型中,获取卷积层的输出,即可得到该图像的特征向量。 7. 特征表示 最后,我们需要将特征向量转换成我们需要的表示方式,比如PCA、LDA、t-SNE等等。这样,我们就可以将图像转换成数值向量,方便进行后续的分类、聚类等任务。 总之,使用CNN模型对图像进行特征提取需要经过数据集准备、模型搭建、训练、特征提取和特征表示等多个步骤,需要仔细设计和调整,以得到高质量的特征向量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值