卷积网络的运算过程以及参数计算过程

卷积网络的运算过程以及参数计算过程

写这篇文章是因为发现自己这么久以来把卷积核的计算过程理解错了,一直到和师兄交流的时候才发现,抓紧写一篇博客记录一下。

1. 卷积神经网络的计算

卷积网络的运算过程以及参数计算过程
以上图为例,假设输入的图片是32×\times 32×\times 3大小,也就是我们所说的输入为32×\times 32大小的RGB图像。我一直理解错的就是这幅图像与卷积核计算的过程,具体怎么错的就不误解大家了。
假设现在我们要用一个5×\times 5×\times 3的卷积核来提取图片中的特征,首先需要注意的一点,我们一般在描述时通常就将这个卷积核称为5×\times 5的卷积核,而忽略掉后面这个3,而卷积核的这个宽度必须与输入的图像的宽度一致,也就是说都是3,当它们的宽度一致时卷积核才可以像我们说的在图像上面滑动。
这时大家可能会有疑问,如果宽度是3,那提取的特征不就一直是3个吗?

如果你有这个问题说明你还是没有理解其计算过程,实际上我们说的5×\times 5×\times 3就是一个卷积核,如果需要提取输入图像的10个特征,那么我们就需要10个这样的卷积核,在论文中通常会把这个卷积部分的大小描述为5×\times 5×\times 10,会省略这个3的书写。这也就是大家理解容易出错的地方。
卷积网络的运算过程以及参数计算过程
在这张图片中我们可以看到这个5×\times 5×\times 3的卷积核提取特征的过程,也就是这个卷积块核图像中一个一样大小的块相乘(dot也就是点乘)再加上偏置项,再使用一个**函数得到最终的特征提取结果。
卷积网络的运算过程以及参数计算过程
从上图我们可以看到卷积核在图像上滑动后得到了一个特征图,因为我们使用了一个卷积核,可以看到得到特征图宽度为1。
那么怎么计算出特征图的大小为28×\times 28呢?
这就要用到我们的一代计算公式:
Hheight=InputheightFilterheight+1H_{height} = \lfloor Input_{height} - Filter_{height} + 1 \rfloor
Wwidth=InputwidthFilterwidth+1W_{width} = \lfloor Input_{width} - Filter_{width} + 1 \rfloor

现在我们可能会发现另一个问题,我们现在所说的卷积核在输入图像上都是一步一步滑动,如下图所示:(图话的比较丑,大家明白意思就行,哈哈)
卷积网络的运算过程以及参数计算过程
有的时候我们需要控制输出的特征图的大小,这时候我们就会选择控制一下卷积核在输入图像上的步长,stride。考虑stride后我们就要用到一个新的计算公式了:
Hheight=InputheightFilterheightstride+1H_{height} = \lfloor{ Input_{height} - Filter_{height} \over stride} + 1\rfloor
Wwidth=InputwidthFilterwidthstride+1W_{width} = \lfloor{ Input_{width} - Filter_{width} \over stride}+1\rfloor
下面我们看一个stride=2时的实例:
卷积网络的运算过程以及参数计算过程
从上图可以看出步长为2可以将原始输入的图像大小减少为原来的一半,stride具有避免重复计算的功能

上面的两个例子讲得都是卷积核能够正好在输入图像上滑动到最右边的,但是在实践中我们可能会遇到卷积核不能正好在输入图像上滑动的,也就是公式不能被整除,这时我们需要用到向下取整,也就是公式中的两个不完整的大括号。

接下来我们会思考使用卷积核提取特征如果遇到我们上述所说的不能整除的情况,那么很可能会舍弃掉一些像素信息,为了解决这个问题我们在提取的时候可以加入padding。
现在到了最后版本的计算公式:

Hheight=InputheightFilterheight+2×paddingstride+1H_{height} = \lfloor{ Input_{height} - Filter_{height} + 2\times padding\over stride}+ 1\rfloor
Wwidth=InputwidthFilterwidth+2×paddingstride+1W_{width} = \lfloor{ Input_{width} - Filter_{width}+2\times padding \over stride}+ 1\rfloor
例子如下图所示:
卷积网络的运算过程以及参数计算过程
接下来我们又会有一个新的疑问,如何选择padding的大小呢?
一般,当stride=1,我们需要满足输入的特征图大小与输出相同时,p=(f1)/2p=(f-1)/2。这个与上图的例子无关,大家可以自己画一个图理解。
在编程的时候我们有两种方法选择,1个是same,一个是valid。
这一部分知识再我的另一篇博客里有讲解,大家可以去看:点这里

以上就是我所总结的所有与卷积计算有关的知识啦,欢迎评论区补充!