卷积神经网络(Convolutional Neural Network,CNN)。
CNN被用于图像识别、语音识别等各种场合,在图像识别的领域中,基于
深度学习的方法几乎都以CNN为基础。
CNN的网络结构,CNN和之前的神经网络一样,可以通过组装层的方式来构建。
CNN新的内容是,出现了卷积层(convolution层)和池化层(pooling层)
对比神经网络的学习
神经网络中,相邻层的所有神经元之间都有连接,这称为全连接(fully-connected)。另外,我们用Affine层实现了全连接层。
如图7-1所示,全连接的神经网络中,Affine层后面跟着激活函数ReLU
层(或者Sigmoid层)。这里堆叠了4层“Affine-ReLU”组合,然后第5层是
Affine层,最后由Softmax层输出最终结果(概率)。
对比CNN的网络(添加了Conv层和Pooling层)
靠近输出的层中使用了之前的“Affine - ReLU”组合。此外,最后的输出层中使用了之前的“Affine - Softmax”组合。这些都是一般的CNN中比较常见的结构。
新的术语
填充、步幅、特征图、各层中传递的数据是有形状的数据(比如说三维数据,而不再是之前神经网络中一维数据)
在全连接层中,相邻层的神经元全部连接在一起,输出的数量可以任意决定,全连接层的问题在于,数据的形状被“忽视”了。输入数据是图像时,图像通常是高、长、通道方向上的3维形状。实际上,前面提到的使用了MNIST数据集的例子中,输入图像就是1通道、高28像素、长28像素
的(1, 28, 28)形状。
一句话说,图像作为3维形状,包含了重要的空间信息,3维形状可能还隐藏着值得提取的本质模式。因为全连接层会忽略形状,导致这一信息无法读取。
而卷积层可以保持形状不变,将图像数据以3维数据的形式输出至下一层。
CNN 中,有时将卷积层的输入输出数据称为特征图(feature map)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)。
卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”。
则在本例中,输入大小是(4, 4),滤波器大小是(3, 3),输出大小是(2, 2)。另外,有的文献中也会用“核”这个词来表示这里所说的“滤波器”
卷积运算以一定的间隔滑动滤波器的窗口并应用。将各个位置上滤
波器的元素和输入的对应元素相乘,然后再求和(这个计算称为乘积累加运算)
在全连接的神经网络中,除了权重参数,还存在偏置。当然在CNN中,滤波器中的参数就是对应神经网络中的权重,也包含偏置的卷积运算。
在进行卷积层的处理之前,有时需要向输入数据的周围填入固定的数据(比如0),这种操作称为“填充”
,对大小为(4, 4)的输入数据应用了幅度为1的填充。
主要是为了调整输出的大小,对大小为(4, 4)的输入数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小比输入大小缩小了 2个元素。*如果反复进行卷积操作,会使得在某个时刻输出大小变为1,导致无法再进行卷积操作。*将填充的幅度设为1,相当于输入的大小为(4,4),而输出的大小也为(4,4),以相同的形状传递给下一层。
应用滤波器的位置间隔称为步幅(stride)
stride=2
综上,增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。
如果将这样的关系写成算式,会如何呢?接下来,我们看一下对于填充和步幅,如何计算输出大小。
这里,假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为
(OH, OW),填充为P,步幅为S。此时,输出大小可通过式(7.1)进行计算。
tips:当输出大小无法除尽时(结果是小数时),需要采取报错等对策。
通道方向:纵深方向。
输入数据和滤波器卷积运算,并将结果相加,从而得到输出。
在3维数据的卷积运算中,输入数据和滤波器的**通道数(特征图数)**要设为相同的值。在这个例子中,输入数据和滤波器的通道数一致,均为3。
把3维数据表示为多维数组时,书写顺序为(channel, height, width)。
得到的输出数据是一张特征图。
如果要得到多张特征图的输出,需要用到多个滤波器。
滤波器的权重数据要按(output_channel, input_channel, height, width)的顺序书写。比如,通道数为3、大小为5 × 5的滤波器有20个时,可以写成(20, 3, 5, 5)。
追加了偏置项的CNN处理流。
每个通道只有一个偏置。这里,偏置的形状是(FN, 1, 1),
滤波器的输出结果的形状是(FN, OH, OW)。这两个方块相加时,要对滤波器的输出结果(FN, OH, OW)按通道加上相同的偏置值。另外,不同形状的方块相加时,可以基于NumPy的广播功能轻松实现。
复习一下广播机制:
import numpy as np
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([0,1,2])
print(a + b)
引用来自:https://www.runoob.com/numpy/numpy-broadcast.html
NumPy 广播(Broadcast)
神经网络中也实现了批处理,通过批处理,能够实现处理高效化和学习时对应的mini-batch。
当然在卷积运算时也同样有对应的批处理,为此,在CNN中各层间传递的数据应保持为4维数据。具体来说就是按照按(batch_num, channel, height, width)保存。
批处理将N次的处理汇总成了1次进行。
从图中也可以看出
池化是缩小高、长方向上的空间运算。
比如,进行将2 × 2的区域集约成1个元素的处理,缩小空间大小。
Max池化 2X2 的区域。
图中设置了步幅为2,因此池化窗口大小会和步幅设定成相同的值。
出了Max池化之外,还有Average池化等,在图像识别领域,主要使用Max池化。
池化层的特征
①池化层和卷积层不同,没有要学习的参数。池化只是从目标区域中取最大值(或者平均值)
②通道数不发生变化经过池化运算,输入数据和输出数据的通道数不会发生变化。
从池化的这种处理方式可以看出来,数据发生微小的变化时,池化后的结果可能相同(也可能不同)
《深度学习入门:基于Python的理论与实现 》斋藤康毅