卷积网络的运算过程以及参数计算过程
写这篇文章是因为发现自己这么久以来把卷积核的计算过程理解错了,一直到和师兄交流的时候才发现,抓紧写一篇博客记录一下。
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也就是点乘)再加上偏置项,再使用一个激活函数得到最终的特征提取结果。其运算过程也可以结合下图理解:
一个RGB图像大小为
6
×
6
6\times 6
6×6,三个通道,中间这一个部分表示是用了两个卷积核,每个卷积核的大小也是
3
×
3
3\times 3
3×3,与输入图像通道数一致,因此卷积核的通道数也是3个。每个卷积核在图像上滑动以后得到的特征图的大小是
4
×
4
4\times 4
4×4,两个卷积核得到的特征图就是
4
×
4
×
2
4\times 4 \times 2
4×4×2。
2. 卷积网络得到特征图的大小计算
从上图我们可以看到卷积核在图像上滑动后得到了一个特征图,因为我们使用了一个卷积核,可以看到得到特征图宽度为1。
那么怎么计算出特征图的大小为28
×
\times
× 28呢?
这就要用到我们的一代计算公式:
H
h
e
i
g
h
t
=
⌊
I
n
p
u
t
h
e
i
g
h
t
−
F
i
l
t
e
r
h
e
i
g
h
t
+
1
⌋
H_{height} = \lfloor Input_{height} - Filter_{height} + 1 \rfloor
Hheight=⌊Inputheight−Filterheight+1⌋
W
w
i
d
t
h
=
⌊
I
n
p
u
t
w
i
d
t
h
−
F
i
l
t
e
r
w
i
d
t
h
+
1
⌋
W_{width} = \lfloor Input_{width} - Filter_{width} + 1 \rfloor
Wwidth=⌊Inputwidth−Filterwidth+1⌋
现在我们可能会发现另一个问题,我们现在所说的卷积核在输入图像上都是一步一步滑动,如下图所示:(图话的比较丑,大家明白意思就行,哈哈)
有的时候我们需要控制输出的特征图的大小,这时候我们就会选择控制一下卷积核在输入图像上的步长,stride。考虑stride后我们就要用到一个新的计算公式了:
H
h
e
i
g
h
t
=
⌊
I
n
p
u
t
h
e
i
g
h
t
−
F
i
l
t
e
r
h
e
i
g
h
t
s
t
r
i
d
e
+
1
⌋
H_{height} = \lfloor{ Input_{height} - Filter_{height} \over stride} + 1\rfloor
Hheight=⌊strideInputheight−Filterheight+1⌋
W
w
i
d
t
h
=
⌊
I
n
p
u
t
w
i
d
t
h
−
F
i
l
t
e
r
w
i
d
t
h
s
t
r
i
d
e
+
1
⌋
W_{width} = \lfloor{ Input_{width} - Filter_{width} \over stride}+1\rfloor
Wwidth=⌊strideInputwidth−Filterwidth+1⌋
下面我们看一个stride=2时的实例:
从上图可以看出步长为2可以将原始输入的图像大小减少为原来的一半,stride具有避免重复计算的功能。
上面的两个例子讲得都是卷积核能够正好在输入图像上滑动到最右边的,但是在实践中我们可能会遇到卷积核不能正好在输入图像上滑动的,也就是公式不能被整除,这时我们需要用到向下取整,也就是公式中的两个不完整的大括号。
接下来我们会思考使用卷积核提取特征如果遇到我们上述所说的不能整除的情况,那么很可能会舍弃掉一些像素信息,为了解决这个问题我们在提取的时候可以加入padding。
现在到了最后版本的计算公式:
H
h
e
i
g
h
t
=
⌊
I
n
p
u
t
h
e
i
g
h
t
−
F
i
l
t
e
r
h
e
i
g
h
t
+
2
×
p
a
d
d
i
n
g
s
t
r
i
d
e
+
1
⌋
H_{height} = \lfloor{ Input_{height} - Filter_{height} + 2\times padding\over stride}+ 1\rfloor
Hheight=⌊strideInputheight−Filterheight+2×padding+1⌋
W
w
i
d
t
h
=
⌊
I
n
p
u
t
w
i
d
t
h
−
F
i
l
t
e
r
w
i
d
t
h
+
2
×
p
a
d
d
i
n
g
s
t
r
i
d
e
+
1
⌋
W_{width} = \lfloor{ Input_{width} - Filter_{width}+2\times padding \over stride}+ 1\rfloor
Wwidth=⌊strideInputwidth−Filterwidth+2×padding+1⌋
例子如下图所示:
接下来我们又会有一个新的疑问,如何选择padding的大小呢?
一般,当stride=1,我们需要满足输入的特征图大小与输出相同时,
p
=
(
f
−
1
)
/
2
p=(f-1)/2
p=(f−1)/2。这个与上图的例子无关,大家可以自己画一个图理解。
在编程的时候我们有两种方法选择,1个是same,一个是valid。
这一部分知识再我的另一篇博客里有讲解,大家可以去看:点这里
3. 卷积神经网络的计算–参数大小
其实参数计算比较简单,我们只要记住一个公式就可以:
某
层
参
数
个
数
=
卷
积
核
的
大
小
×
输
入
图
像
的
通
道
数
×
卷
积
核
的
个
数
+
卷
积
核
个
数
某层参数个数 = 卷积核的大小\times 输入图像的通道数\times 卷积核的个数 + 卷积核个数
某层参数个数=卷积核的大小×输入图像的通道数×卷积核的个数+卷积核个数
其中最后加的这个卷积个数实际上就是偏置单元的个数。
举个例子:一个输入大小为
256
×
256
×
3
256 \times 256\times 3
256×256×3的图像,第一层的卷积核大小为
5
×
5
5 \times 5
5×5,卷积核的个数为10。
那么第一层参数的个数为:
5
×
5
×
3
×
10
+
10
=
760
5\times 5\times 3\times 10 + 10 = 760
5×5×3×10+10=760
以上就是我所总结的所有与卷积计算有关的知识啦,欢迎评论区补充!