本文学习内容全部来自于日本东京工业大学斋藤康毅编写的《深度学习入门-基于Python的理论与实现》一书,从个人角度讲,我是小白,对于这方面之前是一点了解都没有,同学推荐,选择这本书入手,可以说书里将深度学习的一些很基本的地方覆盖的都比较全,每个人使用情况不一样,如果各位看官已经有了不错的基础,看看此书权当知识点回顾,如果跟我一样是小白,从这里开始还是很不错的。
本文仅用于回顾此书中关于卷积神经网络的相关知识
卷积神经网络:(Convolutional Neural Network,CNN),CNN被用于图像识别、语音识别等各种场合,在各类研究开发和竞赛中,基于深度学习的方法几乎都是以CNN为基础
在之前对于神经网络的学习中,相邻层之间的神经元之间全部都有连接,这称为全连接
我们使用Affine层实现全连接层,Affine层后面跟着激活函数Relu层(或Sigmoid层),如图
在这里堆叠了4层“Affine-Relu” 组合,最后第五层是Affine层通过softmax层输出最终结果(概率)
而CNN新增了Convolution层和Pooling层,其连接顺序为“Convolution-Relu-Pooling(有时可省略)”,在靠近输出的层中使用了之前的全连接,结构如下图所示:
但是,如果输入数据是图像时,图像通常含有高,长,通道方向的三维形状,在使用全连接层时,往往需要将3维拉成一维,如在MNIST数据集中,输入的是通道数为1,像素28*28的灰度图像,会被排列成只有1列,含有784个数据的形式输入到Affine层,这会无法利用图像与其形状的关系。
而卷积神经网络不会,在卷积层内可以保持形状不变。
卷积层:卷积层的处理就是卷积运算,卷积运算相当于图像处理中的“滤波器运算”,举个例子:
在本例中,输入数据是(5,5),滤波器大小是(3,3),输出大小是(3,3),图上已经把计算过程写的很清楚了,就是各个位置上滤波器的元素和输入的对应元素相乘再求和,然后将这个结果保存到输出的对应位置。将这个过程应用在所有位置,即可得到卷积运算的输出。
再CNN中,滤波器就对应之前的权重,当然也少不了偏置,偏置通常只有一个,这个值会被加到应用了滤波器的所有元素上,如图
在了解了基本的卷积运算后,考虑了这样一个问题,如果对大小(4,4)的输入,数据应用
(3,3)的滤波器,输出就是(2,2),这在进行多次卷积之后就会出问题,因为每次卷积运算都会缩小空间,在某可是可就可能变成1,导致无法在应用卷积,为了避免这种情况,就要使用填充。还是上面的例子(4,4)输入,填充为1,输出还是保持(4,4),卷积运算就可以再保持空间大小不变的情况下将数据传给下一层
“幅度为1的填充”是指用幅度为1的像素的0填充周围。
卷积层内还有一个重要的属性就是步幅(stride),说的通俗一点就是应用滤波器的窗口一次滑动的距离,说的官方一些:步幅可以指定应用滤波器的间隔。
综上所述:增大步幅后,输出数据会变小;而增大填充,输出数据会变大
那么如何计算输出数据的大小呢?
假设输入大小为(H,W),滤波器大小为(FH,FW)输出大小为(OH,OW),填充为P,步幅为S,此时,输出大小可用下面的公式计算:
代入的值必须要可以除的尽
对于三维数据的卷积运算,通道方向上有多个特征图时,会按照通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出,需要注意的是在三维数据的卷积运算时,输入数据和滤波器的通道数要设为相同的值。结合方块思考,加上偏置:
上图也可以说是对FN个数据的批处理,需要将在各层见传递的数据保存为4维数据,要按照
(batch_num,channel,height,weight)的顺序保存数据
池化层:池化是缩小高、长方向上的空间的运算
上图是按照步幅2进行2*2的Max池化时的处理顺序,一般来说池化的窗口大小会和步幅设定成相同的值。
除了Max池化外,还有Average池化等,在图像识别领域,主要使用Max池化
池化层的特征:
(1)没有要学习的参数:只是从目标区域中获取最大值或平均值
(2)通道数不发生变化:经过池化运算,输入输出的通道数不会发生变化,计算是按照通道独立进行的
(3)对微小位置具有鲁棒性(健壮):输入数据发生微小变化时,池化仍然会返回相同的结果
CNN的可视化
在经过滤波器以前是随即进行初始化的,所以对于灰度图像的黑白浓淡上毫无规律,经过滤波器,变成了有规律的图像。这里没有找到合适的图片,但是经过第一层卷积,在图像的显示上,统一将最小值的显示色为黑色(0),最大值的显示色为白色(255)
那么滤波器的作用到底是什么呢?或者说经过了它,到底学习和观察到了什么?
对水平方向上和垂直方向上的边缘有响应的滤波器:输出图像1中垂直方向的边缘出现白色像素,输出图像2中,水平方向的边缘上出现很多白色像素,由此可知,卷积层的滤波器会提取边缘或斑块等原始信息,而CNN会把这些原始信息传递给后面的层。
上述是针对第一层的卷积层得出的,随着层次加深又会得到什么样的信息?根据研究随着层次加深,提取的信息(反映强烈的神经元)也越来越抽象,下图展示了进行一般物体识别的8层CNN,是基于AlexNet的,AlexNet网络结构堆叠了多层卷积层和池化层,最后经过全连接输出结果
CNN卷积层中提取的信息:第一层的神经元对比边缘或斑块有响应;第三层对纹理有响应;第五层对物体部件有响应;最后的全连接层对物体的类别有响应
也就是说随着层次的加深,神经元从简单的形状向高级的信息变化。换句话说,随着理解的深入,响应的对象在逐渐变化。
具有代表性的CNN
基于CNN的网络结构有很多,VGG,LeNet,AlexNet,ResNet,GoogleNet,这里介绍了LeNet和AlexNet
LeNet:98年提出,是进行手写数字识别的网络,具有连续的卷积层和池化层,最后经全连接层输出结果。原始的LeNet中使用sigmoid函数,而现在使用ReLU函数;对于池化层,原始采用子采样缩小中间数据大小,而现在的CNN往往采用Max池化作为主流
AlexNet:网络结构与LeNet基本没什么不同,有三点差异:激活函数使用ReLU函数;使用进行局部正规化的LRN层;使用Dropout防止过拟合。
应该说网络结构没有太大不同,但围绕他们的环境和计算机技术有了很大进步,GPU的普及,告诉进行大量的运算已经成为可能。
大多数情况下,深度学习(加深了层次的网络)存在大量参数。因此学习需要大量计算,GPU和大数据给这些课题带来了希望
GPU:图形处理器,是一种专门在个人电脑、工作站和一些移动设备上做图像处理和图形相关运算工作的微处理器。