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

分类任务

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训练得到的是滤波器,本质上是对于某种特定的模式有响应,反之无响应,所以全卷积一直到最后一层,响应最强的特征图,就是对应的分类。

时间: 2024-10-11 04:46:47

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

PCB多层板为什么都是偶数层?奇数层不行吗?原因很现实!

PCB板有单面.双面和多层的,其中多层板的层数不限,目前已经有超过100层的PCB,而常见的多层PCB是四层和六层板.那为何大家会有"PCB多层板为什么都是偶数层?"这种疑问呢?相对来说,偶数层的PCB确实要多于奇数层的PCB,也更有优势. 1.成本较低因为少一层介质和敷箔,奇数PCB板原材料的成本略低于偶数层PCB.但是奇数层PCB的加工成本明显高于偶数层PCB.内层的加工成本相同,但敷箔/核结构明显的增加外层的处理成本.奇数层PCB需要在核结构工艺的基础上增加非标准的层叠核层粘合工

caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

在卷积神经网络中.常见到的激活函数有Relu层 layer { name: "relu1" type: "ReLU" bottom: "pool1" top: "pool1" }其中可选参数为:negative_slope:默认为0. 对标准的ReLU函数进行变化,如果设置了这个值,那么数据为负数时,就不再设置为0,而是用原始数据乘以negative_slope relu层有个很大的特点:bottom(输入)和top(输出)一

PHP业务逻辑层和数据访问层设计

以下还是觉得有点抽象 1.面向对象能给我们什么? 进行分析之前,我们先来复习一下面向对象.对象是要进行研究的任何事物.类是具有相同或相似性质的对象的抽象.面向对象的要素:封装.继承.多态.面向对象目的是:如何分配职责. 面向对象设计原则: 单一职责原则 (SRP) 一个类,只有一个引起它变化的原因. 开放-封闭原则 (OCP)(对外)可扩展,(对内)不可修改. 李氏替换原则 (LSP) 子类型必须能够完全替换其父类型. 依赖倒置原则 (DIP) 要依赖于抽象,不要依赖于具体. 接口隔离原则 (I

Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务. 传送门: Android native进程间通信实例-binder篇之——简单的单工通信 这次可以用到这个命令了! 1. 随机选取一个java层的服务. adb shell 中输入命令 service list,选取一个服务来做研究,这次看中的是 textservices, 注意第一个服务 by

DAO层,Service层,Controller层、View层介绍

来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此 接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及 有关数据库连接的参数都在Spring的配置文件中进行配置. Service层 Service 层主要负责业

业务层将持久层方法调用

主要业务层和持久层的联系 员工实体Bean package com.project.bean; import java.sql.Date; /** * 员工信息实体类 * @author 45470 * */ public class EmployeeBean { /**员工id*/ private int empId; /**员工登录名*/ private String empAccount; /**员工登录密码*/ private String empPwd="123456"; /

面向对象——三层架构(表现层、业务层、持久层)

三层架构:即表现层.业务层.持久层. ① 持久层:采用DAO模式,建立实体类和数据库表映射(ORM映射).也就是哪个类对应哪个表,哪个属性对应哪个列.持久层 的目的就是,完成对象数据和关系数据的转换. ② 业务层:采用事务脚本模式.将一个业务中所有的操作封装成一个方法,同时保证方法中所有的数据库更新操作,即保证同时成 功或同时失败.避免部分成功部分失败引起的数据混乱操作. ③ 表现层:采用MVC模式. M称为模型,也就是实体类.用于数据的封装和数据的传输. V为视图,也就是GUI组件,用于数据的

DAO层,Service层,Controller层、View层

DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置. Service层:Service层主要负责业务模块的逻辑应用设计.同样是首先设计接口,再设计其实现的类,接着再Spring的配置文件中配

业务层和数据层

业务层和数据层父类及接口-T4模板 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseBLL.cs using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks; namespace IBLL