正文
7.2 卷积层
7.2.1 全连接层存在的问题
全连接层存在的问题:数据的形状被“忽视”。
卷积神经网络可以保持形状不变。
卷积层的输入数据称为输入特征图(input feature map)
输出数据称为输出特征图(output feature map)
7.2.2 卷积运算
卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。
将各个位置上滤波器的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。然后,将这个结果保存到输出的对应位置。将这个过程在所有位置都进行一遍,就可以得到卷积运算的输出。
7.2.3 填充
在卷积层的处理之前,向输入数据的周围填入固定的数据,称为填充(padding)。
7.2.4 步幅
应用滤波器的位置间隔称为步幅(stride)
假设输入大小为 ,滤波器大小为 ,输出大小为 ,填充为 ,步幅为 。
OH=\frac{H+2P-FH}{S}+1\\OW=\frac{W+2P-FW}{S}+17.2.5 3 维数据的卷积运算
7.2.6 结合方块思考
将数据和滤波器结合长方体的方块来考虑,3 维数据的卷积运算会很容易理解。
7.2.7 批处理
网络间传递的是 4 维数据,对这 N 个数据进行了卷积运算。也就是说,批处理将 N 次的处理汇总成了 1 次进行。
7.3 池化层
池化是缩小高、长方向上的空间的运算。
在图像识别领域,主要使用 Max 池化。
池化层的特征
-
没有要学习的参数
- 池化层和卷积层不同,没有要学习的参数。池化只是从目标区域中取最大值(或者平均值),所以不存在要学习的参数。
-
通道数不发生变化
- 经过池化运算,输入数据和输出数据的通道数不会发生变化。
-
对微小的位置变化具有鲁棒性(健壮)
- 输入数据发生微小偏差时,池化仍会返回相同的结果。因此,池化对输入数据的微小偏差具有鲁棒性。
7.4 卷积层和池化层的实现
7.4.1 4 维数组
所谓 4 维数据,比如数据的形状是(10, 1, 28, 28),则它对应 10 个高为 28、长为 28、通道为 1 的数据。
1 |
|
(10, 1, 28, 28)
访问第 1 个数据:
1 |
|
(1, 28, 28)
访问第 1 个数据的第 1 个通道的空间数据:
1 |
|
7.4.2 基于 im2col 的展开
如果老老实实地实现卷积运算,估计要重复好几层的for
语句。这样的实现有点麻烦,而且,NumPy 中存在使用 for 语句后处理变慢的缺点(NumPy 中,访问元素时最好不要用for
语句)。
im2col
是一个函数,将输入数据展开以适合滤波器(权重)。对 3 维的输入数据应用im2col
后,数据转换为 2 维矩阵(正确地讲,是把包含批数量的 4 维数据转换成了 2 维数据)。
im2col 这个名称是“image to column”的缩写,翻译过来就是“从图像到矩阵”的意思。
7.4.3 卷积层的实现
im2col(input_data, filter_h, filter_w, stride=1, pad=0)
-
input_data―由(数据量,通道,高,长)的 4 维数组构成的输入数据
-
filter_h―滤波器的高
-
filter_w―滤波器的长
-
stride―步幅
-
pad―填充
1 |
|
(9, 75)
(90, 75)
使用 im2col
来实现卷积层:
1 |
|
7.4.4 池化层的实现
池化的应用区域按通道单独展开。
1 |
|
池化层的实现按下面 3 个阶段:
-
展开输入数据。
-
求各行的最大值。
-
转换为合适的输出大小
7.5 CNN 的实现
1 |
|
如果使用 MNIST 数据集训练 SimpleConvNet,则训练数据的识别率为 99.82%,测试数据的识别率为 98.96%(每次学习的识别精度都会发生一些误差)。测试数据的识别率大约为 99%,就小型网络来说,这是一个非常高的识别率。
7.7 具有代表性的 CNN
7.7.1LeNet
于 1998 年首次被提出。
7.7.2 AlexNet
2012 年被提出,AlexNet 是引发深度学习热潮的导火线。
-
激活函数使用 ReLU
-
使用进行局部正规化的 LRN(Local Response Normalization)层
-
使用 Dropout
7.8 小结
-
CNN 在此前的全连接层的网络中新增了卷积层和池化层。
-
使用 im2col 函数可以简单、高效地实现卷积层和池化层。
-
通过 CNN 的可视化,可知随着层次变深,提取的信息愈加高级。
-
LeNet 和 AlexNet 是 CNN 的代表性网络。
-
在深度学习的发展中,大数据和 GPU 做出了很大的贡献。