在上一节课里面,讲到了关于滑动窗口的实现方法,可以在图片内画出一个个框,分别检测框里面是否有符合物体的目标,然后进行整张图片的标注。
但是这样就有一个问题,由于卷积神经网络的计算非常复杂,引入了滑动窗口算法之后,会导致计算量巨大,而且有很多部分是被重复计算了。
如何把全连接层转换成卷积层
在上图当中,上面的过程是正常的一个卷积神经网络的模型,从一开始的过滤器,然后进行最大池化,把这个最大池化后的数组一个个平铺开来,就是一个全连接层了。
那么在下面的过程当中,我们使用卷积的操作,代替全连接层,使得整个过程当中只通过过滤器,来达到跟全连接层一样的效果。(虽然我觉得全连接层和用400个5516的过滤器得到的东西个数从数学上来说是一样的,但是好像和直接拉成一维的又有点不太一样,不太清楚中间是不是有差别)。
那么如何把这个方法用到滑动窗口的卷积计算优化上呢?
在这里,通过演示在16x16x3的图片当中进行14x14x3的窗口滑动,来展现卷积实现滑动窗口与一个个滑动窗口进行分类之间的不同。
正常来说,我们需要在16x16的窗口里一个个进行移动,然后输入到卷积层当中进行计算,我们就拿第一层进行举例,如果是分开来计算的话,假设步长为2x2,那么总共会有4个滑动窗口,也就是4x10x10x16,但是如果通过卷积的方法的话,只会生成一个12x12x16的数组,从计算量来说,就小了一个数量级。
但是在这里我有点迷惑的是,如果我们现在想用步长1x1的窗口进行移动的话,这个数组的大小就不对了啊,如果跟上面的maxpool一样的话,最后生成的滑动窗口个数还是4个,跟预期不太符合。因此这个为什么这么计算我想还是要多看一看。如果从变成全连接层的那个过滤器考虑的话,也是可以做到变成跟滑动窗口一样的个数的,但是是否观察的是对应每一个滑动窗口呢?
然后就是针对之前的图片的滑动窗口卷积实现的演示了,额不过说实话,我这里也没太看懂他为什么从28x28就变成16x16了,可能是因为步长改变了,然后加了padding,不过重点是要学习它的这种卷积的方法。这是一种从数学上纯改进减少计算代价的一种措施。