分类任务

CNN对于常见的分类任务,基本是一个鲁棒且有效的方法。例如,做物体分类的话,入门级别的做法就是利用caffe提供的alexnet的模型,然后把输出的全连接层稍稍修改称为自己想要的类别数,然后再根据实际需要修改网络模型(通常是瘦身)。下面记录几个point。

关于crop

一般在训练的时候会利用两个手段做data augmentation,分别是mirror和crop。其中,mirror没什么特别,但是crop有一些东西我们需要了解。

  • 在训练的时候,crop操作会在大图上随机切小图,然后小图才是进入CNN的数据;而在测试的时候,crop操作是直接在大图中间取小图;
  • 我们做前向的时候,可以考虑模拟训练时候的crop机制,多crop几份,然后每一个crop都前向一遍,然后综合考虑多个crop的前向结果;
  • 上一点提到的多个crop类似于多次试验求平均的感觉;
  • 多crop求平均的手法可以构成一个batch来一起走一次前向;

以上是比较普通的trick,仔细思考第四点的计算性能,我们会发现,这种做法对于一张完整的大图而言,有很多像素都被重复计算了。那么,下面介绍一种较为巧妙的思路(需要对卷积层以及对特征有比较深刻的理理解)。

  • 依然用普通的方式训练一个CNN
  • 一般我们的网络在最后面会加入全连接层把feature map压成一个一维向量,然后我们需要先理解一个说法:全连接层实际上是n个1*1的卷积核对上层feature进行卷积,然后在对卷积后的feature做一次均值pooling;

下面用两个简单的例子说明:

例1
<fc1> output: 9
<fc2> output: 1 [1 2 3 4 5 6 7 8 9]
[a b c d e f g h i]
得到
[1*a+2*b+3*c+...+9*i]

则需要的9个权值,每个权值一一对应fc1的值。那么假如,fc2换成卷积层,那么

<fc1> output:9
<conv2> output:1, kernel:(1,1) [1 2 3 4 5 6 7 8 9]
[a b c d e f g h i]
得到
[1*a 2*b 3*c ... 9*i]

刚好也是需要9个权值,一一对应fc1。但是呢,这时候经过conv2的卷积,目前的feature实际上就保持了和fc1一致的形状。那么怎么把它变成我们想要的output=1呢?这时候就是一个均值加权的过程,即卷积后的九个值求加权平均得到真正的输出。

例2

理解了例1后,再来理解例2

<conv1> outputsize:(1,2,2)  # 1通道,宽高各为2
<fc2> output: 2 1 2
3 4 a b e f
c d , g h 得到
[a*1+b*2+c*3+d*4, e*1+f*2+g*3+h*4]

这个网络需要的同样是4*2=8个权值,每4个一组分别对应展开conv1后的4个像素,共两组,故可以得到两个计算值。这时候,把网络变成

<conv1> shape:(1,2,2)  # 1通道,宽高各为2
<conv2> kernel:(1,1), output:2 1 2
3 4 a b e f
c d , g h 得到两个特征矩阵
1a 2b 1e 2f
3c 4d , 3g 4h

实际上只需要分别把两个矩阵所有元素求和就可以得到与全连接一样的值。

回到正题,花了很多笔墨提出这个全连接层等同与1*1卷积核,是为了在前向时把全连接层替换掉。为什么呢?假设没有全连接层,实际上我们对于输入图片的大小是没有任何限制的,大图小图一样都经过卷积池化激活。这种网络有人称为全卷积网络(FCN)。

好,那么现在替换全连接层为卷积层之后,输入图片大小是任意的,那么意味着最后一层出来的feature不再是1*1,而可能是m*n。所以为了映射到分类任务的结果,把最后的featuremap做一下求和,然后送入softmax层,就得到了每个类别的可能性。

那么,为什么我将这部分内容放在“关于crop”这个标签下面呢?思考一下,假如用普通的crop策略,那么是不是相当于全卷积到最后一层只取出crop区域对应的特征图的点区域?全卷积是不是就相当于crop了全图的所有能crop的区域并融合在一起?(有点拗口)核心的思想是,CNN训练得到的是滤波器,本质上是对于某种特定的模式有响应,反之无响应,所以全卷积一直到最后一层,响应最强的特征图,就是对应的分类。

FCN用卷积层代替FC层原因(转)的更多相关文章

  1. FCN用卷积层代替FC层原因(转)

    原博客连接 : https://www.cnblogs.com/byteHuang/p/6959714.html CNN对于常见的分类任务,基本是一个鲁棒且有效的方法.例如,做物体分类的话,入门级别的 ...

  2. CNN 文本分类模型优化经验——关键点:加卷积层和FC可以提高精度,在FC前加BN可以加快收敛,有时候可以提高精度,FC后加dropout,conv_1d的input维度加大可以提高精度,但是到256会出现OOM。

    network = tflearn.input_data(shape=[None, max_len], name='input') network = tflearn.embedding(networ ...

  3. 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考???

    https://blog.csdn.net/saw009/article/details/80590245 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考??? 首先图1是LeNe ...

  4. 全连接层(FC)与全局平均池化层(GAP)

    在卷积神经网络的最后,往往会出现一两层全连接层,全连接一般会把卷积输出的二维特征图转化成一维的一个向量,全连接层的每一个节点都与上一层每个节点连接,是把前一层的输出特征都综合起来,所以该层的权值参数是 ...

  5. 卷积层和BN层融合

    常规的神经网络连接结构如下  当网络训练完成, 在推导的时候为了加速运算, 通常将卷积层和 batch-norm 层融合, 原理如下 \[ \begin{align*} y_{conv} & ...

  6. tensorflow的卷积和池化层(二):记实践之cifar10

    在tensorflow中的卷积和池化层(一)和各种卷积类型Convolution这两篇博客中,主要讲解了卷积神经网络的核心层,同时也结合当下流行的Caffe和tf框架做了介绍,本篇博客将接着tenso ...

  7. tensorflow中的卷积和池化层(一)

    在官方tutorial的帮助下,我们已经使用了最简单的CNN用于Mnist的问题,而其实在这个过程中,主要的问题在于如何设置CNN网络,这和Caffe等框架的原理是一样的,但是tf的设置似乎更加简洁. ...

  8. AI:IPPR的数学表示-CNN基本结构分析( Conv层、Pooling层、FCN层/softmax层)

    类似于SVM,CNN为代表的DNN方法的边缘参数随着多类和高精度的要求必然增长.比如向量机方法,使用可以映射到无穷维的高斯核,即使进行两类分类,在大数据集上得到高精度,即保持准确率和高精度的双指标,支 ...

  9. CNN中卷积层 池化层反向传播

    参考:https://blog.csdn.net/kyang624823/article/details/78633897 卷积层 池化层反向传播: 1,CNN的前向传播 a)对于卷积层,卷积核与输入 ...

随机推荐

  1. 杭电acm 1015题

    马上要找工作了,锻炼下自己的写程序能力,不多说,上代码 /********************杭电acm 1015 已AC 在这个程序里,使用穷举法来实现,但是输出顺序需要安装字典的最大 来输出 ...

  2. JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-007Inheritance of embeddable classes(@MappedSuperclass、@Embeddable、@AttributeOverrides、、)

    一.结构 二.代码 1. package org.jpwh.model.inheritance.embeddable; import javax.persistence.MappedSuperclas ...

  3. Java Annotation详解

    元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: l          编写文档:通过代码里标识的元数据生成文档. l         ...

  4. Java50道经典习题-程序37 报数

    题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位.分析:最后留下的是第n号那位 import java.util.Scanne ...

  5. 用create table 命令建立表

    create table [[V.]HANKE.].MADE IN HOME (xuliehao int primary key, name varchar(20)not null, jiage fl ...

  6. 将Winform程序及dll打包成可执行的exe

    使用场景 通常开发的Winform程序,引用了其他类库后,在输出目录下都会产生很多DLL文件,exe执行时必须依赖这些DLL.想要Winform程序只有一个可执行exe文件,又不想打包成安装包,就可以 ...

  7. java 获取url及url参数解析

    java  获取url及url参数解析 一.url编码:URLEncoder.encode(userName); 二.url解码: URLDecoder.decode(userName);

  8. 移动端自适应个人理解与收集——rem

    rem——更好的适配移动端.这个单位我一直想弄个究竟,今天终于看了个差不多.看了很多的博客.心中总算有自己的想法.(还有vh,vw这里我这个小白还没有弄明白就先不写了.) 1.rem可以在html,b ...

  9. Django之博客系统邮件分享博客

    在上一章中,我们创建了一个基础的博客应用,我们能在http://127.0.0.1:8000/blog/显示我们的博客.在这一章我们将尝试给博客系统添加一些高级的特性,比如通过email来分享帖子,添 ...

  10. iOS开发:setNeedsLayOut和setNeedsDisplay区别

    1.layoutSubviews方法 1.1 根据苹果官方帮助文档对layoutSubviews方法的解释: 此方法用来重新定义子元素的位置和大小.当子类重写此方法,用来实现UI元素的更精确布局.如果 ...