标签:响应 性能 利用 思想 模式 网络 重复 矩阵 int
CNN对于常见的分类任务,基本是一个鲁棒且有效的方法。例如,做物体分类的话,入门级别的做法就是利用caffe提供的alexnet的模型,然后把输出的全连接层稍稍修改称为自己想要的类别数,然后再根据实际需要修改网络模型(通常是瘦身)。下面记录几个point。
一般在训练的时候会利用两个手段做data augmentation,分别是mirror和crop。其中,mirror没什么特别,但是crop有一些东西我们需要了解。
以上是比较普通的trick,仔细思考第四点的计算性能,我们会发现,这种做法对于一张完整的大图而言,有很多像素都被重复计算了。那么,下面介绍一种较为巧妙的思路(需要对卷积层以及对特征有比较深刻的理理解)。
下面用两个简单的例子说明:
<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呢?这时候就是一个均值加权的过程,即卷积后的九个值求加权平均得到真正的输出。
理解了例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训练得到的是滤波器,本质上是对于某种特定的模式有响应,反之无响应,所以全卷积一直到最后一层,响应最强的特征图,就是对应的分类。
标签:响应 性能 利用 思想 模式 网络 重复 矩阵 int
原文地址:http://www.cnblogs.com/byteHuang/p/6959714.html