CNN

0、前置知识

单通道图

俗称灰度图,每个像素点只能有有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色,中间值是一些不同等级的灰色。(也有3通道的灰度图,3通道灰度图只有一个通道有值,其他两个通道的值都是零)。

上面是一张单通道图。

三通道图

三通道图,每个像素点都有3个值表示 ,所以就是3通道。也有4通道的图。例如RGB图片即为三通道图片,RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。总之,每一个点由三个值表示。

上图显示了一张图片是由 RGB 三个通道组成的。

1、CNN 模型结构

如上图所示,一个卷积神经网络由若干卷积层、Pooling 层、全连接层组成。你可以构建各种不同的卷积神经网络,它的常用架构模式为:

INPUT -> [[CONV] * N -> POOL?] * M -> [FC] * K

也就是 N 个卷积层叠加,然后(可选)叠加一个 Pooling 层,重复这个结构 M 次,最后叠加 K 个全连接层。

对于上图所展示的卷积神经网络:

INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC

按照上述模式可以表示为:

INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2

也就是:

N = 1, M = 2, K = 2。

2、全连接网络处理图片的局限性

参数数量太多

如果一张图片有三个通道,每个通道是 100 * 100 的矩阵,将这张图片每个通道中的矩阵拉平,每个通道可以获得一个 1 万维的向量,然后将三个通道拼接,获得 3 万维的向量。接下来跟隐层中的 100 个节点做全连接,会出现 3 * 100 * 100 * 100 = 3 百万个参数。

在上面的图片中,红色框圈出了鸟嘴、鸟眼、鸟脚三个特征,选择其中的一个特征不太可能确定是鸟类,但是将 3 个特征结合起来,就有非常大的概率可以确定是鸟类了。这样就不需要让神经元看到整张图片的信息。

相同特征可能出现在不同区域

对于鸟嘴这个特征,他可能会出现在图片的左上角,也可能出现在图片的中间,但是无论出现在什么位置,它都是识别鸟类的重要特征,所以特征出现的区域不应该影响鸟类的识别。

3、CNN的优点

为了解决上面提到的全连接网络的不足,CNN 提出了下面的解决方法。

接收视野

为了解决 参数数量太多 的问题,使用了接收视野 来将一块比较小的区域输入到神经元中。假如使用 3 * 3 * 3 的 Filter,将 接收视野 中的每个矩阵拉直,再拼接,输入到一个神经元中,会有 3 * 3 * 3 = 27 的参数数量

下采样

下采样操作也是解决参数过多的手段,上图中左侧是原始图像,右侧是对左侧图片每隔一个像素点取样一次得到的图片,右图对于我们的识别是没有影响的,这样通过改变输入的数量,改变了参数的数量。

权值共享

为了解决 相同特征可能出现在不同区域 的问题,通过权值共享让具有相同特征的区域在输出时具有基本相同的输出。

4、CNN 网络架构

前面的 CNN 模型结构 已经介绍了一个卷积神经网络由若干卷积层、Pooling层、全连接层组成。下面是对卷积层和 Pooling 层的介绍。

卷积层

所有的数据和图片来自于 https://www.zybuluo.com/hanbingtao/note/485480

单通道单 Filter 卷积

卷积层对应的是卷积操作。

假设有一个 5 * 5 的图像,使用一个 3 * 3 的 filter 进行卷积,想得到一个3 * 3的Feature Map,如下所示:

可以依次计算出Feature Map中所有元素的值。下面的动画显示了整个Feature Map的计算过程:

上面的计算过程中,步幅(stride)为1。步幅可以设为大于1的数。例如,当步幅为2时,Feature Map计算如下:

多通道单 Filter 卷积

上面讲的都是单通道的卷积操作,也就是假设图片只有一个通道,下面列举有 3 个通道的图片。

将 $X$ 分为 3 个 7 * 7 的矩阵,分别为 $X1、X2、X3$,将 Filter1 分为 3 个 3 * 3 的矩阵,分别为 $W_1$、$W_2$、$W_3$,将 $X1$ 与 $W_1$ 做卷积操作(单通道的卷积操作)得到$C1$,$X2$ 与 $W_2$ 做卷积操作得到$C2$,$X3$ 与 $W_3$ 做卷积操作得到 $C3$,然后将 $C1$、$C2$、$C3$ 的对应元素相加,最后加上偏置 $W_b = 1$,得到 $O1$。

下面的代码对 O1 进行了实现,feature_map 就是 O1 所表示的矩阵

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import numpy as np

# 定义图片的 3 个通道信息

X1 = np.array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 0, 2, 0],
[0, 2, 2, 2, 2, 1, 0],
[0, 1, 0, 0, 2, 0, 0],
[0, 0, 1, 1, 0, 0, 0],
[0, 1, 2, 0, 0, 2, 0],
[0, 0, 0, 0, 0, 0, 0]])

X2 = np.array([[0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 2, 2, 0, 0],
[0, 0, 0, 0, 2, 0, 0],
[0, 1, 2, 1, 2, 1, 0],
[0, 1, 0, 0, 0, 0, 0],
[0, 1, 2, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0]])

X3 = np.array([[0, 0, 0, 0, 0, 0, 0],
[0, 2, 1, 2, 0, 0, 0],
[0, 1, 0, 0, 1, 0, 0],
[0, 0, 2, 1, 0, 1, 0],
[0, 0, 1, 2, 2, 2, 0],
[0, 2, 1, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 0]])
# 定义 3 个 filter 信息
image_filter1 = np.array([[-1, 1, 0],[0, 1, 0],[0, 1, 1]])
image_filter2 = np.array([[-1, -1, 0],[0, 0, 0],[0, -1, 0]])
image_filter3 = np.array([[0, 0, -1],[0, 1, 0],[1, -1, -1]])

width = X1.shape[-1]
height = X1.shape[0]

# 步长
stride = 2
# 图片信息
Xs = [X1,X2,X3]
# filter 信息
image_filters = [image_filter1,image_filter2,image_filter3]
# 通道大小
channel_number = len(Xs)
filter_size = len(image_filters)
# 偏置
b = 1


feature_map_width = (width - filter_size) // stride + 1
feature_map_height = (height - filter_size) // stride + 1

feature_map = np.zeros((feature_map_height,feature_map_width))
for k in range(channel_number):
for i in range(0,width - filter_size + 1,stride):
for j in range(0,height - filter_size + 1,stride):
X = Xs[k]
image_filter = image_filters[k]
feature_map[i // stride][j // stride] += (np.sum(X[i : i + filter_size, j : j + filter_size] * image_filter))
# 添加偏置
feature_map +=b

多通道多Filter卷积

上面讲述的是单通道单 Filter,在单通道单 Filter 中,只能够产生一个输出,但是在多通道多 Filter 中会产生多个输出,即一个 Filter 会产生一个输出。

与单通道单 Filter 产生 O1 的方式一样,可以通过 $X1、X2、X3$ 与 Filter2 中的 $W_4$、$W_5$、$W_6$ 得到 $O2$,这样就能通过 2 个 Filter 获得 2 个输出,因此存在几个 Filter 就能产生几个输出。

以上就是卷积层的计算方法。这里面体现了局部连接和权值共享:每层神经元只和上一层部分神经元相连(卷积计算规则),且 filter 的权值对于上一层所有神经元都是一样的。对于包含两个 3 * 3 * 3 的 fitler 的卷积层来说,其参数数量仅有(3 * 3 * 3 + 1) * 2 = 56 个,且参数数量与上一层神经元个数无关。与全连接神经网络相比,其参数数量大大减少了。

Pooling层

Max Pooling

Max Pooling实际上就是在 n * n 的样本中取最大值,上面是在一个 2 * 2 的样本中选取最大的值。分别在红色、绿色、黄色、蓝色区域选取最大的值,组成了右侧的矩阵。

Mean Pooling

Mean Pooling实际上就是在 n * n 的样本中取最平均值

5、卷积神经网络的训练

卷积神经网络的训练过程与推到见 https://www.zybuluo.com/hanbingtao/note/485480

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信