0
点赞
收藏
分享

微信扫一扫

【DL基础】一篇文章解决卷积运算中的尺寸问题



戳一戳!和我一起走进深度学习的世界

导读

我们常常听到卷积神经网络,卷积的概念,也会在代码中分析,图像的尺寸是如何经过卷积不断变换!


今天,让我们通过这篇文章,深入探讨一下卷积中的那些事,一起来聊聊卷积后的特征图的尺寸问题,如何解决无法全部运算的问题。


如果你有什么问题,或者有什么想法,欢迎评论与我一起沟通交流。




1 再讲卷积

之前有一篇文章,专门讲解了卷积神经网络,在里面,我们讲解了卷积的离散和连续形式。


​​【卷积神经网络】01 卷积神经网络简介​​


在我们的深度学习计算机视觉领域中,卷积神经网络一般都是使用离散的形式的。


之前已经讲过卷积了,今天再讲,讲什么呢?让我们从一个问题,开始引入吧!

1 看个问题

给你一个n×n×3的图像,经过卷积核为m×m×3,步长为s的卷积运算。现在问你:


1.能做多少次卷积运算?卷积后的图像尺寸是多少?


2.满足什么条件,图像的所有像素才会参与卷积运算?

2 从简单的开始

我们令图像的大小为10×10×1,卷积核大小为3×3×1,步长为1。


卷积之后的结果,其实就是卷积核中心能够到达的所有的位置构成的新的矩阵


卷积核大小为3×3,卷积核距离上下左右四个边界都为1,则上下左右各有一像素不能到达。


能到达的位置如下图所示:


【DL基础】一篇文章解决卷积运算中的尺寸问题_与运算


也就是说,上下左右各要减去3/2(向下取整)行或列像素。


那中间还剩下(10-3/2)×(10-3/2),即8×8=64个像素。因为步长为1,所以卷积核中心每个位置都能达到。


所以一共能做多少次卷积运算呢卷积后的图像尺寸是多少呢


我们认为卷积核和图像中的一部分进行一次运算得到一个值是一次卷积运算,所以一共能做64次卷积运算。卷积完之后,就是所有卷积核中心所到达的位置构成的新的矩阵,即卷积后的像素为8×8。


满足什么条件,图像的所有像素才会参与卷积运算


对于我们这种简单的情况,所有的像素都会参与运算。



3 提高难度

我们令图像的大小为10×10×3,卷积核大小为5×5×3,步长为2。


首先我们要明确一点,卷积核的深度和图像的深度或者特征图的深度是一致的


所以不管怎么做运算,一个卷积核和一个图像运算得到的特征图是二维的,即只有行列两个维度。


这一点是因为,卷积是在行列两个方向进行卷积,从而更好地提取平面特征


我们要考虑的不是这个深度,所以在此提一下就好,重点在于步长。前面我们说到,步长不是1就可能会出现像素无法参与计算的情况。


以我们这个示例为例,卷积核能到达的位置是(下图中的黄色位置):


【DL基础】一篇文章解决卷积运算中的尺寸问题_卷积_02


也就是说,卷积能“波及”到的范围如下(下图中的有色位置):


【DL基础】一篇文章解决卷积运算中的尺寸问题_与运算_03


剩下“波及”不到的范围,就不参与运算了。后面我们会讲,这种情况,我们怎么解决。



这样的话,我们看前面的图,就能知道,生成的特征图大小为:


【DL基础】一篇文章解决卷积运算中的尺寸问题_卷积核_04


能参与卷积运算的范围尺寸为:


【DL基础】一篇文章解决卷积运算中的尺寸问题_与运算_05

4 总结一下

我们现在回归到最初的问题。


给你一个n×n×3的图像,经过卷积核为m×m×3,步长为s的卷积运算。现在问你:


1.能做多少次卷积运算?卷积后的图像尺寸是多少?


2.满足什么条件,图像的所有像素才会参与卷积运算?


我想我们经过前面的讲解,我们应该能够得出结论了。


对于一个n×n×3的图像,经过卷积核为m×m×3,步长为s的卷积运算:


卷积后图像的尺寸为卷积核在行列两个方向分别能够到达的位置。又由于m是奇数,所以我们可以得到如下公式:


【DL基础】一篇文章解决卷积运算中的尺寸问题_卷积核_06


我们也可以知道卷积核的行列相乘即为卷积运算的次数


能参与卷积运算的像素范围如下:


【DL基础】一篇文章解决卷积运算中的尺寸问题_卷积_07


对于第二个问题,我们前面发现了,有可能有些像素是无法参与运算的。


简单来说,这些参与不参与运算,可能不会有太大影响,因为可能只是很小的像素,不会对整体有太大的影响。但是如果特征偏偏就在这个边缘处呢?


所以我们先考虑什么样的图像,会使得所有的像素都参与运算。什么情况下能够保证所有像素都参与运算?


想要保证所有的都参与运算,就要满足:


卷积核的最上面一行能够计算到图像的最上面一行。
卷积核的最下面一行能够计算到图像的最下面一行。
卷积核的最左面一行能够计算到图像的最左面一行。
卷积核的最右面一行能够计算到图像的最右面一行。


所以,对于n×n×3的图像,和m×m×3的卷积核,想要全部都参与运算,就要满足下面的式子:




【DL基础】一篇文章解决卷积运算中的尺寸问题_卷积核_08


2 边缘扩展

前面我们讲到了总会有一些情况,会导致有些边缘无法参与运算。为什么会导致这种情况,这种情况又该如何解决呢?

1 边缘无法参与运算原因

前面我们讲到,有些节点是不会参与运算的。前面我们只是提了一下,并没有深入纠结。在这里我们着重说一下讲完这些,我们来看一下,为什么会有节点无法参与运算呢?


对于前面的示例,我们说,如果步长大于1,就有可能有节点无法参与运算。在我们的示例中出现了如下问题:


1.如果到达最后,不运算,后面的像素就无法参与运算了(下图中白色背景未参与运算)。


【DL基础】一篇文章解决卷积运算中的尺寸问题_与运算_03


2.可如果要运算,又有几个位置是没有数据的,参与运算会出问题(最后一列和最后一行无数据,访问越界):


【DL基础】一篇文章解决卷积运算中的尺寸问题_卷积_10


所以,边缘无法参与运算就是因为这种问题的出现。


这种问题也不是不可解,因为这是很多卷积神经网络会遇到的问题,具体如何解决呢?让我们接着往下看。

2 边缘扩展

采用上面的第二种方法,即要继续往后运算,有几个位置没有像素,如何处理?


没有像素,创造像素也要上。


我们可以给这几个没有像素的位置赋值,让这些值参与运算,这样,就解决了前面的问题。


上面这种解决方法,也是很多方案都会采用的方法,比如AlexNet中,就采用了边缘扩展,方便进行计算。当然,我们后面还会讲解AlexNet的理论,具体的细节也会在那里讲解。

3 边缘扩展的问题及常用方法

边缘扩展解决了我们前面提到的问题,但是也引入了一个新的问题,这个问题就是,我们创造的像素哪里来呢


如果我们使用pytorch或者TensorFlow这些模型去搭建深度学习网络,当然是不用担心这个问题,因为我们直接设置参数,让这些模型去头疼好了。


对于我们个人来说,这个确实是一个值得思考的问题,因为像素是我们创建的,相当于超参数的存在,设置不当,会导致模型检测精度下降、模型训练时间变长,模型特征不易提取或者提取有误差等问题。


针对这个问题,一方面,我们创建的边缘像素相对于整个图像来说还是比较小的,从整体训练角度来看,有其他更多的问题影响模型精度等其他问题,相对于其他问题,这个问题就是小巫见大巫了。


另一方面,我们常常可以使用的边缘扩展的算法,图像处理中也有专门的涉及,主要包括如下几种:


0填充
使用指定像素值填充
使用已知的相邻边缘像素值填充
使用已知的边缘像素值反转填充
用另外一边的像素值补偿填充


具体的内容,我会在后面计算机视觉-OpenCV入门教程中详细讲解,欢迎大家关注。

3 说在后面的话

到这里,这块内容就讲的差不多了,卷积计算中的一些细节问题真的是很多入门者的劝退良药。希望能够通过我的这些讲解,让大家能够更快、更轻松地了解相关的知识。


深度学习之路漫漫,让我陪你一起,坚持走下去!



AI与区块链技术

【DL基础】一篇文章解决卷积运算中的尺寸问题_与运算_11

长按二维码关注












举报

相关推荐

0 条评论