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

最新文章

  1. 高性能IO模型浅析
  2. Tomcat 启动花费很长时间的解决方案
  3. knockoutJS学习笔记04:监控属性
  4. SmartImageView
  5. php中static静态关键字的使用
  6. Introduction to Face Detection and Face Recognition
  7. Java中的JDBC基础
  8. 转:Cache相关
  9. Jrtplib
  10. 【入门】安装Elasticsearch5.0 部署Head插件
  11. node--更新数据库问题
  12. 实现鼠标hover动画效果自己理解的两种方法——练习笔记
  13. 【总目录】——概率论与数理统计及Python实现
  14. Unity AssetBundle 游戏资源分类及关系
  15. 数组属性的习题、Arrays工具、二维数组
  16. 以实例说明微服务拆分(以SpringCloud+Gradle)
  17. #WEB安全基础 : HTML/CSS | 文章索引
  18. python之路-字符串
  19. Codeforces 1041F Ray in the tube (看题解)
  20. Amount of Degrees(数位dp)

热门文章

  1. picoCTF2018记录
  2. 小程序 if else
  3. C++入门到理解阶段二基础篇(8)——C++指针
  4. 利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)
  5. FLV提取AAC音频单独播放并实现可视化的频谱
  6. go语言之数据类型和格式化输出
  7. DevExpress的进度条控件ProgressBarControl的使用-以ZedGraph添加曲线进度为例
  8. ABP学习资源
  9. 【转载】Android N 完全不同以往的四个新特性
  10. XPath匹配标签使用text()判断获取结果失败/为空的问题及解决方法