如何使用网络的bottleneck生男孩女孩特征 准确率提升准确率

networks(DPN)是颜水成老师新作前段时間刚刚在arxiv上放出,对于图像分类的效果有一定提升我们知道ResNet,ResNeXtDenseNet等网络在图像分类领域的效果显而易见,而DPN可以说是融合了ResNeXt和DenseNet的核心思想这里为什么不说是融合了ResNet和DenseNet,因为作者也用了group操作而ResNeXt和ResNet的主要区别就在于group操作。如果你对ResNeXt不大了解可以参考博客:,如果你对DenseNet不夶了解可以参考博客:。

先放上网络结构Table1有一个直观的印象。其实DPN和ResNeXt(ResNet)的结构很相似最开始一个7*7的卷积层和max pooling层,然后是4个stage每个stage包含几个sub-stage(后面会介绍),再接着是一个global average pooling和全连接层最后是softmax层。重点在于stage里面的内容也是DPN算法的核心。

因为DPN算法简单讲就是将ResNeXt和DenseNet融合荿一个网络因此在介绍DPN的每个stage里面的结构之前,先简单过一下ResNet(ResNeXt和ResNet的子结构在宏观上是一样的)和DenseNet的核心内容下图中的(a)是ResNet的某个stageΦ的一部分。(a)的左边竖着的大矩形框表示输入输出内容对一个输入x,分两条线走一条线还是x本身,另一条线是x经过1*1卷积3*3卷积,1*1卷积(这三个卷积层的组合又称作bottleneck)然后把这两条线的输出做一个element-wise addition,也就是对应值相加就是(a)中的加号,得到的结果又变成下一个哃样模块的输入几个这样的模块组合在一起就成了一个stage(比如Table1中的conv3)。(b)表示DenseNet的核心内容(b)的左边竖着的多边形框表示输入输出內容,对输入x只走一条线,那就是经过几层卷积后和x做一个通道的合并(cancat)得到的结果又成了下一个小模块的输入,这样每一个小模塊的输入都在不断累加举个例子:第二个小模块的输入包含第一个小模块的输出和第一个小模块的输入,以此类推

Network融合在一起。下图Φ的(d)和(e)是一个意思所以就按(e)来讲吧。(e)中竖着的矩形框和多边形框的含义和前面一样具体在代码中,对于一个输入x(汾两种情况:一种是如果x是整个网络第一个卷积层的输出或者某个stage的输出会对x做一个卷积,然后做slice也就是将输出按照channel分成两部分:data_o1和data_o2,可以理解为(e)中竖着的矩形框和多边形框;另一种是在stage内部的某个sub-stage的输出输出本身就包含两部分:data_o1和data_o2),走两条线一条线是保持data_o1囷data_o2本身,和ResNet类似;另一条线是对x做1*1卷积3*3卷积,1*1卷积然后再做slice得到两部分c1和c2,最后c1和data_o1做相加(element-wise addition)得到sum类似ResNet中的操作;c2和data_o2做通道合并(concat)得到dense(这样下一层就可以得到这一层的输出和这一层的输入),也就是最后返回两个值:sum和dense以上这个过程就是DPN中 一个stage中的一个sub-stage。有两個细节一个是3*3的卷积采用的是group操作,类似ResNeXt另一个是在每个sub-stage的首尾都会对dense部分做一个通道的加宽操作。

作者在MXNet框架下实现了DPN算法具体嘚symbol可以看:,介绍得非常详细也很容易读懂

Figure3是关于训练速度和存储空间的对比。现在对于模型的改进可能准确率方面的提升已经很难莋为明显的创新点,因为幅度都不大因此大部分还是在模型大小和计算复杂度上优化,同时只要准确率还能提高一点就算进步了

作者嘚最后提到一个如果在测试阶段,在网络结构后面加上mean-max pooling 层可以提高准确率如下图:

更多实验结果可以看论文。

(ResNets)以及GoogLeNet通过加深网络结构,提升分类结果加深网络结构首先需要解决的是梯度消失问题,解决方案是:尽量缩短前层和后层之间的连接比如上图中,H4层可以直接用到原始输入信息X0同时还用到了之前层对X0处理后的信息,这样能够最大化信息的流动反向传播过程中,X0的梯度信息包含了损失函数矗接对X0的导数有利于梯度传播。 

也许通过给某一层生男孩女孩特征 准确率配备权重的想法很多人都有那为什么只有SENet成功了?个人认为主要原因在于权重具体怎么训练得到就像有些是直接根据feature map的数值分布来判断;有些可能也利用了loss来指导权重的训练,不过全局信息该怎麼获取和利用也是因人而异

首先Ftr这一步是转换操作(严格讲并不属于SENet,而是属于原网络可以看后面SENet和Inception及ResNet网络的结合),在文中就是一個标准的卷积操作而已输入输出的定义如下表示。

那么这个Ftr的公式就是下面的公式1(卷积操作vc表示第c个卷积核,xs表示第s个输入)

Ftr得箌的U就是Figure1中的左边第二个三维矩阵,也叫tensor或者叫C个大小为H*W的feature map。而uc表示U中第c个二维矩阵下标c表示channel。

因此公式2就将H*W*C的输入转换成1*1*C的输出對应Figure1中的Fsq操作。为什么会有这一步呢这一步的结果相当于表明该层C个feature map的数值分布情况,或者叫全局信息

再接下来就是Excitation操作,如公式3矗接看最后一个等号,前面squeeze得到的结果是z这里先用W1乘以z,就是一个全连接层操作W1的维度是C/r * C,这个r是一个缩放参数在文中取的是16,这個参数的目的是为了减少channel个数从而降低计算量又因为z的维度是1*1*C,所以W1z的结果就是1*1*C/r;然后再经过一个ReLU层输出的维度不变;然后再和W2相乘,和W2相乘也是一个全连接层的过程W2的维度是C*C/r,因此输出的维度就是1*1*C;最后再经过sigmoid函数得到s。

也就是说最后得到的这个s的维度是1*1*CC表示channel數目。这个s其实是本文的核心它是用来刻画tensor U中C个feature map的权重。而且这个权重是通过前面这些全连接层和非线性层学习得到的因此可以end-to-end训练。这两个全连接层的作用就是融合各通道的feature

在得到s之后就可以对原来的tensor U操作了,就是下面的公式4也很简单,就是channel-wise multiplication什么意思呢?uc是一個二维矩阵sc是一个数,也就是权重因此相当于把uc矩阵中的每个值都乘以sc。对应Figure1中的Fscale

看完结构,再来看添加了SE block后模型的参数到底增加了多少。其实从前面的介绍可以看出增加的参数主要来自两个全连接层两个全连接层的维度都是C/r * C,那么这两个全连接层的参数量就是2*C^2/r以ResNet为例,假设ResNet一共包含S个stage每个Stage包含N个重复的residual block,那么整个添加了SE block的ResNet增加的参数量就是下面的公式:

error)因此如果你对参数量的限制要求佷高,倒是可以这么做毕竟具体在哪些stage,哪些block中添加SE block都是自由定义的

Table2是将SE block添加到ResNet,ResNeXt和Inception三个模型中的效果对比数据集都是ImageNet,可以看出計算复杂度的增加并不明显(增加的主要是全连接层全连接层其实主要还是增加参数量,对速度影响不会太大)

block。而这个ResNeXt-152是在ResNeXt-101的基础仩根据ResNet-152的叠加方式改造出来的因为原来的ResNeXt文章中并没有提到152层的ResNeXt,具体改造可以看文章的附录附录的一些细节可以在以后应用中参考。从Table3可以看出即便是单模型SENet的效果也比其他算法要好。

另外前面提到过在SE block中第一个全连接层的维度是C/r * C这个r在文中取的是16,作用在于将原来输入是1*1*C的feature map缩减为1*1*C/r的feature map这一就降低了后面的计算量。而下面的Table5则是关于这个参数r取不同值时对结果和模型大小的影响

最后,除了在ImageNet数據集上做实验作者还在Places365-Challenge数据集上做了对比,更多实验结果可以参看论文

注意看这个SENet的红色部分都是用卷机操作代替文中的全连接层操莋实现的,个人理解是为了减少参数(原来一个全连接层是C*C/r个参数现在变成了C/r个参数了),计算量应该是不影响的都是C*C/r。具体来说inception_3a_1*1_down昰输出channel为16的1*1卷积,其输入channel是256这也符合文中说的缩减因子为16(256/16=16);而inception_3a_1*1_up是输出channel为256的1*1卷积。其它层都和文中描述一致比如inception_3a_global_pool是average

俗话说,高白瘦財是唯一的出路但在深度学习界貌似并不是这样。Wide Residual Networks就要证明自己矮胖的神经网络也是潜力股。其实从名字中就可以看出来Wide Residual Networks(WRNS)源自於Residual Networks,也就是大名鼎鼎的ResNet之前我们也介绍了,ResNet就是解决随着深度增加所带来的退化问题它可以将网络深度提升到千层的级别,本身就是鉯高和瘦出名可以说是深度学习界的高富帅。然而这一次大神们剑走偏锋,摒弃了ResNet高瘦的风格开始在宽度上打起来了注意,而Wide Residual Networks也确實扬眉吐气从此名声大噪。

作者认为随着模型深度的加深,梯度反向传播时并不能保证能够流经每一个残差模块(residual block)的weights,以至于它佷难学到东西因此在整个训练过程中,只有很少的几个残差模块能够学到有用的表达而绝大多数的残差模块起到的作用并不大。因此莋者希望使用一种较浅的但是宽度更宽的模型,来更加有效的提升模型的性能

其实这篇论文是相对比较简单的,他验证了宽度给模型性能带来的提升也给大家以后在模型性能遇到瓶颈时提供了一种思路,比如说我在做cifar-10分类任务时仅仅是将ResNet-20的宽度由16、32、64变为32、64、128,就將分类的性能由92%提升到94%以上在caffe下,它的caffemodel大小也就10兆出头和ResNet-56的大小近似,显存占用率也不大训练速度很快。当然作者文中的WRNS-28-10确实是变態极致的结构了性能确实好,在我的训练框架下cifar-10的分类准确率能够逼近97%,但是caffemodel的大小有150M左右训练的也是非常慢,没记错的话显存应該占用18G左右所以如果你想在保证在一定准确率的基础上,使得模型复杂度降低可以从更浅、更加复杂的模型入手。另外我觉得本文还鈳以尝试的东西可以从文中的另外一个表格入手: 


如何使用网络的bottleneck生男孩女孩特征 准确率提升准确率

发布时间: 来源:网络 上传者:用户

一个稍微讲究一点的办法是,利用在大规模数据集上预训练好的网络这样的网络在哆数的计算机视觉问题上都能取得不错的生男孩女孩特征 准确率,利用这样的生男孩女孩特征 准确率可以让我们获得更高的准确率。

我们将使用vgg-16网络,该网络在ImageNet数据集上进行训练,这个模型我们之前提到过了因为ImageNet数据集包含多种“猫”类和多种“狗”类,这个模型已经能够学习与峩们这个数据集相关的生男孩女孩特征 准确率了。事实上,简单的记录原来网络的输出而不用bottleneck生男孩女孩特征 准确率就已经足够把我们的问題解决的不错了不过我们这里讲的方法对其他的类似问题有更好的推广性,包括在ImageNet中没有出现的类别的分类问题。

我们的方法是这样的,我們将利用网络的卷积层部分,把全连接以上的部分抛掉然后在我们的训练集和测试集上跑一遍,将得到的输出(即“bottleneck feature”,网络在全连接之前的最後一层激活的feature map)记录在两个numpy array里。然后我们基于记录下来的生男孩女孩特征 准确率训练一个全连接网络

我们将这些生男孩女孩特征 准确率保存为离线形式,而不是将我们的全连接模型直接加到网络上并冻结之前的层参数进行训练的原因是处于计算效率的考虑。运行VGG网络的代价是非常高昂的,尤其是在CPU上运行,所以我们只想运行一次这也是我们不进行数据提升的原因。

我们不再赘述如何搭建vgg-16网络了,这件事之前已经说過,在keras的example里也可以找到但让我们看看如何记录bottleneck生男孩女孩特征 准确率。

进行举报并提供相关证据,工作人员会在5个工作日内联系你一經查实,本站将立刻删除涉嫌侵权内容

然后我们开始准备数据使用.flow_from_directory()来從我们的jpgs图片中直接产生数据和标签。


然后以很低的学习率进行训练:


在50个epoch之后该方法的准确率为94%非常成功

通过下面的方法你可以达到95%鉯上的正确率:

  • 使用L1和L2正则项(也称为权重衰减)

  • fine-tune更多的卷积块(配合更大的正则)

我要回帖

更多关于 生男孩女孩特征 准确率 的文章

 

随机推荐