卷积神经网络

理论

  • 卷积神经网络
    • 卷积操作、池化操作、全连接操作
  • 深度可分离卷积
  • 数据增强
  • 迁移学习

卷积神经网络

「卷积神经网络」主要用于图像方向的深度学习神经网络。

结构

卷积神经网络:
(卷积层 + (可选)池化层) * N + 全连接层 * M

(C_{onvolutionalLayer} + (可选)S_{ubsamplingLayer})*N + D_{enseLayer} * M\\{}\\ N\geqslant1,M\geqslant0

卷积层的输入和输出都是矩阵,全连接层的输入和输出都是向量,所以最后一层卷积层后要做展平。
「卷积神经网络」适用于分类任务或回归任务,一般用于分类任务。

LcWreBYjed.png!large

全卷积神经网络:

(卷积层 + (可选)池化层) * N + 反卷积层 * K

(C_{onvolutionalLayer} + (可选)S_{ubsamplingLayer})*N + De_{convolutionLayer} * K\\{}\\ N\geqslant1,M\geqslant0

「全卷积神经网络」适用于物体分割任务,因为输入和输出的尺寸是一样的。

zRFTwlYqkY.png!large

卷积解决的问题

神经网络遇到的问题:

  • 参数过多
    • 计算资源不足
      • 例:图像大小 1000*1000
      • 下一层神经元为 10^6
      • 全连接参数为 1000 * 1000 * 10^6=10^12
      • 一层全连接层就有一万亿个参数,这是现代计算机无法承受的。
    • 容易过拟合,需要更多训练数据

解决方案之「局部连接」:

8wlGPQ720H.png!large

上图中,右侧是「局部连接」:

  • 图像大小 1000*1000
  • 下一层神经元为 10^6
  • 局部连接范围为 10*10
  • 全连接参数为 10 * 10 * 10^6 = 10^8

解决方案之「参数共享」:
参数共享指的是不同的局部连接之间的参数是一样的,比如上图的红色连接中有 100 个参数,蓝色连接中也有 100 个参数,这个红色连接的参数和蓝色连接的参数是同一组 100 个参数。
经过参数共享之后:

  • 图像大小 1000*1000
  • 下一层神经元为 10^6
  • 局部连接范围为 10*10
  • 全连接参数为 10 * 10 = 10^2

因为做了参数共享,所以局部范围和下一层神经元就没有关系了。
我们从 1000000000000 个参数变成了 100 个参数,为局部连接有效呢?这是图像问题本身所决定的。
对于图像问题来说,图像具备很强的区域性。比如爱因斯坦的肖像那张图中相近的像素的值很相近,对于额头、脸颊或者对于嘴部区域,相近的像素的值都很接近。对于爱因斯坦肖像图,无论构图时是把爱因斯坦的脸放在图像中间还是左上左下右上右下,仍然是一张脸。对于脸部特征来说,构图位置无论在图像中的哪里,都是脸部信息。参数共享提供了这种可能性,使得无论如何构图,都能用同一组参数进行处理,得到图像是一张脸的事实。如果不用参数共享,很有可能只能得到中间位置的脸,脸部挪到图像边上去可能就检测不出来了。

  • 局部连接
    • 图像的区域性
  • 参数共享
    • 图像特征与位置无关

小知识点补充:神经网络容量是指可以学习到的信息量。

卷积操作

卷积 —— 每个位置进行计算

输入图像:

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

卷积核:

1 0 1
0 1 0
1 0 1

输出:

? ? ?
? ? ?
? ? ?

卷积核围绕输入数据滑动方向为从左往右从上往下滑动

输出size = 输入size - 卷积核size + 1
输出size = 输入size - (卷积核size - 1)

O_{size}=I_{size}-Convolutionkernel_{size}+1

左上角卷积计算「点积乘法」:

result=1\times1+1\times3+1\times7+1\times11+1\times13=35

得出输出矩阵的左上角结果:

35 ? ?
? ? ?
? ? ?

第二步卷积计算「点积乘法」:

result=1\times2+1\times4+1\times8+1\times12+1\times14=40

得出输出矩阵的第二步结果:

35 40 ?
? ? ?
? ? ?

以上卷积核滑动步长默认为 1,如果步长为 2,意味着第一步卷积核对输入图像的红色部分进行计算:

1
2
3
4 5
6
7
8
9 10
11
12
13
14 15
16 17 18 19 20
21 22 23 24 25

第一步卷积核对输入图像的红色部分进行计算:

1 2
3
4
5
6 7
8
9
10
11 12
13
14
15
16 17 18 19 20
21 22 23 24 25

步长越长,输出矩阵越小,比如以上输入图像矩阵经过 3*3 卷积核计算,输出矩阵大小为 2*2:

result_{step2}=1\cdot3+1\cdot5+1\cdot9+1\cdot13+1\cdot15=45

输出:

35 45
? ?

步长太大会引发一个问题: 如果是一个深度卷积神经网络,每一层矩阵规格的减小,会使得图像最后消没了。 这样的问题有一个解决方法 —— 「Padding」 将输入图像矩阵外圈补 0。比如以上的输入数据补成:

0
0
0
0
0
0
0
0
1 2 3 4 5
0
0
6 7 8 9 10
0
0
11 12 13 14 15
0
0
16 17 18 19 20
0
0
21 22 23 24 25
0
0
0
0
0
0
0
0

经过卷积核计算后输出:

? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?

这样卷积核的中间点的位活动的位置就变大了,使得输出可以变得和输入图像一样大,甚至可以变得更大,一般情况下,只需要补 0 补到一样就可以了。

以上输入的的都单通道的,现实场景中图像是多通道的,比如 RGB 三通道,对于多通道的卷积处理方式:

HzLvsLKbcA.png!large

上图可以看出一个卷积核可以提取一组特征,从多通道输入变成了单通道输出,但是项目一般都需要多通道输出:

XIVhWRZaeL.png!large

还有一种操作,输入通道数为 4,输出通道数为 2,对每个通道分别做操作,加和到输出W^1
7wAUW1qicC.png!large

池化操作

最大值池化

输入图像

1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

最大池化核:
Max-pool 操作
Stride = 2
Kernel_size = 2*2

- -
- -

输出:

7 9
17 19

平均池化核:
Avg-pool 操作
Stride = 2
Kernel_size = 2*2

输出:

4 6
14 16

池化操作特点:

  • 常使用不重叠、不补零
  • 没有用于求导的参数
  • 池化层参数为步长和池化核大小
  • 用于减少图像尺寸,从而减少计算量
  • 一定程度平移鲁棒
  • 损失了空间位置精度
本作品采用《CC 协议》,转载必须注明作者和本文链接
不要试图用百米冲刺的方法完成马拉松比赛。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!