FCN用卷积层代替FC层原因(转)
原博客连接 : https://www.cnblogs.com/byteHuang/p/6959714.html
CNN对于常见的分类任务,基本是一个鲁棒且有效的方法。例如,做物体分类的话,入门级别的做法就是利用caffe提供的alexnet的模型,然后把输出的全连接层稍稍修改成为自己想要的类别数,然后再根据实际需要修改网络模型(通常是瘦身)。下面记录几个Point。
关于Crop
一般在训练的时候会利用两个手段做data augmentation, 分别是mirror和crop。其中,mirror没什么特别,但是crop有一些东西我们需要了解。
- 在训练的时候, crop操作会在大图上随机切小图,然后小图才是进入cnn的数据;而在测试的时候,crop操作是直接在大图中取小图(意思是输入的是大图);
- 我们做前向的时候,可以考虑模拟训练时候的crop机制,多crop几份,然后每一个crop都前向一遍,然后综合考虑多个crop的前向结果。
- 上一点提到的多个crop类似于多次实验求平均的感觉;
- 多crop求平均的手法可以构成一个batch来一起走一次前向
以上是比较普通的trick,仔细思考第四点的计算性能,我们会发现,这种做法对于一张完整的大图而言,有很多像素都被重复计算了。那么,下面介绍一种较为巧妙的思路(需要对卷积层及对特征有较为深刻的理解)--CNN转FCN的思路:
- 依然用普通的方式训练一个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 map实际上就保持了和fc1一致的形状。那么怎么把它变成我们想要的output=1呢?这时候就是一个均值加权的过程,即卷积后的9个值加权平均得到真正的输出。
例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个像素,共2组,故可以得到两个计算值。这时候,把网络变成
<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。所以为了映射到分类任务的结果,把最后的feature map做一下求和,然后送入softmax层,就得到了每个类别的可能性。
那么, 为什么我将这部分内容放在“关于crop"这个标签下面呢?思考一下,加入用普通的crop策略,那么是不是相当于全卷积层到最后一层只取出crop区域对应的特征图的点区域?全卷积是不是相当于crop了全图的所有能crop的区域并融合在一起?(有点拗口)。核心思想是,CNN训练得到的是滤波器,本质生是对于某种特定的模式有响应,反之无响应,所以全卷积一直到最后一层,响应最强的特征图,就是对应的分类。
FCN用卷积层代替FC层原因(转)的更多相关文章
- FCN用卷积层代替FC层原因(转)
分类任务 CNN对于常见的分类任务,基本是一个鲁棒且有效的方法.例如,做物体分类的话,入门级别的做法就是利用caffe提供的alexnet的模型,然后把输出的全连接层稍稍修改称为自己想要的类别数,然后 ...
- 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 ...
- 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考???
https://blog.csdn.net/saw009/article/details/80590245 关于LeNet-5卷积神经网络 S2层与C3层连接的参数计算的思考??? 首先图1是LeNe ...
- 全连接层(FC)与全局平均池化层(GAP)
在卷积神经网络的最后,往往会出现一两层全连接层,全连接一般会把卷积输出的二维特征图转化成一维的一个向量,全连接层的每一个节点都与上一层每个节点连接,是把前一层的输出特征都综合起来,所以该层的权值参数是 ...
- 卷积层和BN层融合
常规的神经网络连接结构如下  当网络训练完成, 在推导的时候为了加速运算, 通常将卷积层和 batch-norm 层融合, 原理如下 \[ \begin{align*} y_{conv} & ...
- tensorflow的卷积和池化层(二):记实践之cifar10
在tensorflow中的卷积和池化层(一)和各种卷积类型Convolution这两篇博客中,主要讲解了卷积神经网络的核心层,同时也结合当下流行的Caffe和tf框架做了介绍,本篇博客将接着tenso ...
- tensorflow中的卷积和池化层(一)
在官方tutorial的帮助下,我们已经使用了最简单的CNN用于Mnist的问题,而其实在这个过程中,主要的问题在于如何设置CNN网络,这和Caffe等框架的原理是一样的,但是tf的设置似乎更加简洁. ...
- AI:IPPR的数学表示-CNN基本结构分析( Conv层、Pooling层、FCN层/softmax层)
类似于SVM,CNN为代表的DNN方法的边缘参数随着多类和高精度的要求必然增长.比如向量机方法,使用可以映射到无穷维的高斯核,即使进行两类分类,在大数据集上得到高精度,即保持准确率和高精度的双指标,支 ...
- CNN中卷积层 池化层反向传播
参考:https://blog.csdn.net/kyang624823/article/details/78633897 卷积层 池化层反向传播: 1,CNN的前向传播 a)对于卷积层,卷积核与输入 ...
随机推荐
- jmeter相关知识学习记录
基于Jmeter5.2.1 断言之响应断言 响应断言:对服务器的响应接口进行断言校验,来判断接口测试得到的接口返回值是否正确. 测试字段就是指要断言的内容的匹配处. 响应文本:就是响应的body部分: ...
- 关于Excel做表小知识记录
关于Excel做表小知识记录 最近使用Excel做了一系列的报表,觉得这是个很神奇的东西哈哈哈,以前我可是一想到Excel就开始头疼的人... 能用代码或者SQL语句解决的问题绝不会愿意留在Exce ...
- Java基础(七)
左连接,右连接,内连接,全连接的区别 左连接:返回左表所有行,右表没有匹配行则返回null 右连接:返回右表所有行,左表没有匹配行则返回null 内连接:返回左右表共有行 全连接:返回左右表所有行,无 ...
- Appium+Java 自动化测试系列二:Maven+Testng
新建Maven项目作为测试项目分为3个步骤: 1.Eclipse安装Testng 插件 2.新建Maven项目 3.引入Testng 一.Eclipse安装Testng插件 TestNG安装可选择在线 ...
- HDU - 5952 Counting Cliques
Counting Cliques HDU - 5952 OJ-ID: hdu-5952 author:Caution_X date of submission:20191110 tags:dfs,gr ...
- ASP.NET MVC教程三:ASP.NET MVC部署方式
ASP.NET MVC编写的程序需要部署到IIS上面才能进行访问,部署方式分为两种. 一.直接用源代码部署 第一种方式可以直接使用源代码进行部署.部署步骤: 1.新建网站 在IIS里面选择网站,然后右 ...
- Android中的常用控件之进度条(ProgressBar)
ProgressBar的常用属性:style,进度条的样式,默认为圆形,用style="?android:attr/progressBarStyleHorizontal"可以将进度 ...
- C# IE环境 - 重置IE( 注册表)
IE设置,都可以通过注册表,修改.以下是一些常用的IE设置注册表修改~ 检查证书吊销 /// <summary> /// 检查证书是否吊销 /// </summary> /// ...
- 关于C# webapi ,接口返回字符串和json格式 ,返回值中有反斜杠
最近遇到一个比较郁闷的问题,记录一下 写了一个接口,想返回json 数据,但是返回值中总是带有反斜杠... ,下面来看原因 首先,配置 webapi的路由 App_Start 文件夹下 ,WebApi ...
- Java生鲜电商平台-缓存架构实战
Java生鲜电商平台-缓存架构实战 说明:在Java生鲜电商中,缓存起到了非常重要的作用,目前整个项目中才用的是redis做分布式缓存. 缓存集群 缓存集群存在的问题 1.热key 缓存集群中的某个k ...