07 深度学习之卷积神经网络
1.整体结构
全连接
相邻层的所有神经元之间都有连接
基于全连接层(Affine层)的网络

基于CNN的网络

CNN的层的连接顺序是“Convolution - ReLU -(Pooling)”(Pooling层有时会被省略)。这可以理解为之前的“Affi ne - ReLU”连接被替换成了“Convolution - ReLU -(Pooling)”连接。
靠近输出的层中使用了之前的“Affine - ReLU”组合。此外,最后的输出层中使用了之前的“Affi ne - Softmax”组合。
2.卷积层
目的
解决全连接层存在的问题,数据的形状被“忽视”了。
特征图
CNN 中,称卷积层的输入输出数据为特征图。
卷积运算
卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。
步骤:
(1)无偏置

(2)有偏置

这个值会被加到应用了滤波器的所有元素上。
填充
(1)填充方法
在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如 0等)。对大小为 (4, 4)的输入数据应用了幅度为 1的填充。“幅度为 1的填充”是指用幅度为 1像素的 0填充周围。
(2)填充图像

(3)填充目的
使用填充主要是为了调整输出的大小,保证卷积运算就在保持空间大小不变的情况下将数据传给下一层。
步幅
应用滤波器的位置间隔称为步幅。增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。

如何计算输出大小

3维数据的卷积运算
图像是3维数据,除了高、长方向之外,还需要处理通道方向。通道方向上有多个特征图时,会按通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出。


在3维数据的卷积运算中,输入数据和滤波器的通道数要设为相同的值。
结合方块思考卷积运算
(1)输出一张特征图

(2)输出多张特征图

需要用到多个滤波器(权重)。滤波器的权重数据要按 (output_channel, input_channel, height, width)的顺序书写。比如,通道数为 3、大小为 5 ×5的滤波器有 20个时,可以写成 (20, 3, 5, 5)。
(3)加入偏置

这两个方块相加时,要对滤波器的输出结果 (FN, OH, OW)按通道加上相同的偏置值。另外,不同形状的方块相加时,可以基于 NumPy的广播功能轻松实现。
3.池化层
目的
池化是缩小高、长方向上的空间的运算。
Max池化的处理顺序

Max池化”是获取最大值的运算.一般来说,池化的窗口大小会和步幅设定成相同的值。比如,3 ×3的窗口的步幅会设为 3,4 ×4的窗口的步幅会设为4。
池化层的特征
(1)没有要学习的参数
(2)通道数不发生变化
(3)对微小的位置变化具有鲁棒性(健壮)
4.卷积层和池化层的实现
基于 im2col 的展开
(1)原因
如果老老实实地实现卷积运算,估计要重复好几层的 for语句。这样的实现有点麻烦,而且,NumPy中存在使用 for语句后处理变慢的缺点。因此使用 im2col这个便利的函数进行简单的实现。
(2)im2col的示意图



卷积层的实现
(1)im2col提供的接口

(2)im2col初始化

(3)im2col来实现卷积层

Number(滤波器数量)、Channel、FilterHeight、FilterWidth的缩写.输入数据的四维形状(N,C,H,W).这里通过 reshape(FN,-1)将参数指定为 -1,这是reshape的一个便利的功能。reshape函数会自动计算 -1维度上的元素个数,以使多维数组的元素个数前后一致。比如,(10, 3, 5, 5)形状的数组的元素个数共有 750个,指定 reshape(10,-1)后,就会转换成 (10, 75)形状的数组。forward的实现中,最后会将输出大小转换为合适的形状。

池化层的实现
(1)对输入数据展开池化的应用区域

(2)求得池化的应用区域内的最大值

CNN 的实现

CNN 的可视化
(1)第 1 层权重的可视化
学习前的滤波器是随机进行初始化的,所以在黑白的浓淡上没有规律可循,但学习后的滤波器变成了有规律的图像。


(2)基于分层结构的信息提取
如果堆叠了多层卷积层,则随着层次加深,提取的信息也愈加复杂、抽象,这是深度学习中很有意思的一个地方。最开始的层对简单的边缘有响应,接下来的层对纹理有响应,再后面的层对更加复杂的物体部件有响应。也就是说,随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。
具有代表性的 CNN
(1)LeNet
(2)AlexNet