卷积神经网络CNN的初理解

前言

卷积神经网络(Convolutional Neural Network,CNN)。
CNN被用于图像识别、语音识别等各种场合,在图像识别的领域中,基于
深度学习的方法几乎都以CNN为基础。

CNN整体结构

CNN的网络结构,CNN和之前的神经网络一样,可以通过组装层的方式来构建。
CNN新的内容是,出现了卷积层(convolution层)和池化层(pooling层)

对比神经网络的学习

神经网络中,相邻层的所有神经元之间都有连接,这称为全连接(fully-connected)。另外,我们用Affine层实现了全连接层。
如图7-1所示,全连接的神经网络中,Affine层后面跟着激活函数ReLU
层(或者Sigmoid层)。这里堆叠了4层“Affine-ReLU”组合,然后第5层是
Affine层,最后由Softmax层输出最终结果(概率)。
卷积神经网络CNN的初理解_第1张图片
对比CNN的网络(添加了Conv层和Pooling层)
卷积神经网络CNN的初理解_第2张图片
靠近输出的层中使用了之前的“Affine - ReLU”组合。此外,最后的输出层中使用了之前的“Affine - Softmax”组合。这些都是一般的CNN中比较常见的结构。

卷积层(Convolution层)

新的术语

填充、步幅、特征图、各层中传递的数据是有形状的数据(比如说三维数据,而不再是之前神经网络中一维数据)

全连接层存在的问题

在全连接层中,相邻层的神经元全部连接在一起,输出的数量可以任意决定,全连接层的问题在于,数据的形状被“忽视”了。输入数据是图像时,图像通常是高、长、通道方向上的3维形状。实际上,前面提到的使用了MNIST数据集的例子中,输入图像就是1通道、高28像素、长28像素
的(1, 28, 28)形状。
一句话说,图像作为3维形状,包含了重要的空间信息,3维形状可能还隐藏着值得提取的本质模式。因为全连接层会忽略形状,导致这一信息无法读取。
而卷积层可以保持形状不变,将图像数据以3维数据的形式输出至下一层。
CNN 中,有时将卷积层的输入输出数据称为特征图(feature map)。其中,卷积层的输入数据称为输入特征图(input feature map),输出数据称为输出特征图(output feature map)。

卷积运算

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波器运算”
卷积神经网络CNN的初理解_第3张图片
则在本例中,输入大小是(4, 4),滤波器大小是(3, 3),输出大小是(2, 2)。另外,有的文献中也会用“”这个词来表示这里所说的“滤波器
卷积运算以一定的间隔滑动滤波器的窗口并应用。将各个位置上滤
波器的元素和输入的对应元素相乘,然后再求和(这个计算称为乘积累加运算

在全连接的神经网络中,除了权重参数,还存在偏置。当然在CNN中,滤波器中的参数就是对应神经网络中的权重,也包含偏置的卷积运算
卷积神经网络CNN的初理解_第4张图片

填充

在进行卷积层的处理之前,有时需要向输入数据的周围填入固定的数据(比如0),这种操作称为“填充
,对大小为(4, 4)的输入数据应用了幅度为1的填充。
卷积神经网络CNN的初理解_第5张图片

为什么使用填充

主要是为了调整输出的大小,对大小为(4, 4)的输入数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小比输入大小缩小了 2个元素。*如果反复进行卷积操作,会使得在某个时刻输出大小变为1,导致无法再进行卷积操作。*将填充的幅度设为1,相当于输入的大小为(4,4),而输出的大小也为(4,4),以相同的形状传递给下一层。

步幅

应用滤波器的位置间隔称为步幅(stride)
stride=2
卷积神经网络CNN的初理解_第6张图片

综上,增大步幅后,输出大小会变小。而增大填充后,输出大小会变大。
如果将这样的关系写成算式,会如何呢?接下来,我们看一下对于填充和步幅,如何计算输出大小。
这里,假设输入大小为(H, W),滤波器大小为(FH, FW),输出大小为
(OH, OW),填充为P,步幅为S。此时,输出大小可通过式(7.1)进行计算。
卷积神经网络CNN的初理解_第7张图片
tips:当输出大小无法除尽时(结果是小数时),需要采取报错等对策。

3维数据的卷积运算

通道方向:纵深方向。
输入数据和滤波器卷积运算,并将结果相加,从而得到输出。
卷积神经网络CNN的初理解_第8张图片
在3维数据的卷积运算中,输入数据和滤波器的**通道数(特征图数)**要设为相同的值。在这个例子中,输入数据和滤波器的通道数一致,均为3。

结合方块思考

把3维数据表示为多维数组时,书写顺序为(channel, height, width)。
卷积神经网络CNN的初理解_第9张图片
得到的输出数据是一张特征图。
如果要得到多张特征图的输出,需要用到多个滤波器。
卷积神经网络CNN的初理解_第10张图片
滤波器的权重数据要按(output_channel, input_channel, height, width)的顺序书写。比如,通道数为3、大小为5 × 5的滤波器有20个时,可以写成(20, 3, 5, 5)。

追加了偏置项的CNN处理流。
卷积神经网络CNN的初理解_第11张图片
每个通道只有一个偏置。这里,偏置的形状是(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)

卷积神经网络CNN的初理解_第12张图片引用来自:https://www.runoob.com/numpy/numpy-broadcast.html
NumPy 广播(Broadcast)

批处理

神经网络中也实现了批处理,通过批处理,能够实现处理高效化和学习时对应的mini-batch。
当然在卷积运算时也同样有对应的批处理,为此,在CNN中各层间传递的数据应保持为4维数据。具体来说就是按照按(batch_num, channel, height, width)保存。
批处理将N次的处理汇总成了1次进行。
从图中也可以看出卷积神经网络CNN的初理解_第13张图片

池化层

池化是缩小高、长方向上的空间运算
比如,进行将2 × 2的区域集约成1个元素的处理,缩小空间大小。

Max池化 2X2 的区域。
图中设置了步幅为2,因此池化窗口大小会和步幅设定成相同的值。

出了Max池化之外,还有Average池化等,在图像识别领域,主要使用Max池化。

卷积神经网络CNN的初理解_第14张图片

池化层的特征
①池化层和卷积层不同,没有要学习的参数。池化只是从目标区域中取最大值(或者平均值)
②通道数不发生变化经过池化运算,输入数据和输出数据的通道数不会发生变化。

卷积神经网络CNN的初理解_第15张图片
从池化的这种处理方式可以看出来,数据发生微小的变化时,池化后的结果可能相同(也可能不同)
卷积神经网络CNN的初理解_第16张图片

参考

《深度学习入门:基于Python的理论与实现 》斋藤康毅

你可能感兴趣的:(深度学习,cnn,深度学习,神经网络)