「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
引言
从最基本的什么是神经网络谈起吧🧐
我理解的就是:你在输入层扔进一把数据,这些数据会在隐藏层进行变换,最后在输出层给你返回你期待的数据。
相比其他深度、前馈神经网络,卷积神经网络可以用更少的参数获得更高的性能。目前卷积神经网络主要使用在图像和视频分析的各种任务(比如图像分类、人脸识别、物体识别和图像分割等)上,其正确率一般也远远超过了其他的神经网络模型。目前CNN也广泛应用到NLP、推荐系统等领域。
卷积神经网络是一种具有局部连接、权重共享等特性的深度前馈神经网络。
你一定想知道什么是深度前馈神经网络吧😜
- 深度是因为神经网络中的隐含层可能会有很多很多层
- 前馈是因为在此种神经网络中,各神经元从输入层开始,接收前一级输入,并输入到下一级,直至输出层。整个网络中是单向传播的,在输出和模型本身之间没有反馈。
误差反向传播学习算法
先来了解经常提到的BP神经网络🎈
BP神经网络可以看作一个“万能的模型+误差修正函数”,它会对每次训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型。
举一个例子:比如某厂商生产一种产品,投放到市场之后得到了消费者的反馈,厂商会根据消费者的反馈对产品进一步升级,优化,从而生产出让消费者更满意的产品。
这就是BP神经网络的核心——BP(Back Propagation)算法,也就是误差反向传播学习算法,正向计算输出-反向传播误差。
卷积
从一个最简单的栗子谈起——边界检测,假设我们有这样的一张图片,大小 8×8
图片中的数字代表该位置的像素值,像素值越大,颜色越亮,所以为了示意,我们把右边小像素的地方画成深色。图的中间两个颜色的分界线就是我们要检测的边界。怎么检测这个边界呢?我们可以设计这样的一个 滤波器(filter,也称为kernel) ,大小3×3:
然后,我们用这个filter,往我们的图片上“盖”,覆盖一块跟filter一样大的区域之后,和原始图像进行相乘求和。
计算一个区域之后,就向其他区域挪动,接着计算,直到把原图片的每一个角落都覆盖到了为止。这个过程就是 “卷积” 。
这个图片,中间颜色浅,两边颜色深,这说明咱们的原图片中间的边界,在这里被反映出来了!
从上面这个例子中,我们发现,我们可以通过设计特定的filter,让它去跟图片做卷积,就可以识别出图片中的某些特征,比如边界。我们的CNN,主要就是通过一个个的filter,不断地提取特征,从局部的特征到总体的特征,从而进行图像识别等等功能。
从一个小小的权重矩阵,也就是卷积核(kernel)开始,让它逐步在二维输入数据上“扫描”。卷积核“滑动”的同时,计算权重矩阵和扫描所得的数据矩阵的乘积,然后把结果汇总成一个输出像素。
深度学习里面所谓的卷积运算,其实它被称为互相关(cross-correlation)运算: 将图像矩阵中,从左到右,由上到下,取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,最后的结果组成一个矩阵,其中没有对核进行翻转。
经典概念
1️⃣stride 步长
滑动卷积核时,我们会先从输入的左上角开始,每次往左滑动一列或者往下滑动一行逐一计算输出,我们将每次滑动的行数和列数称为Stride,在之前的图片中,Stride=1;在下图中,Stride=2。
2️⃣padding 填白
从上面的栗子中,我们可以知道,原图像在经过filter卷积之后,变小了,从(8,8)变成了(6,6)。假设我们再卷一次,那大小就变成了(4,4)了。这样有啥问题呢? 主要有两个问题:
- 每次卷积,图像都缩小,这样卷不了几次就没了;
- 相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少。这样的话,边缘的信息就易于丢失。
为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。
比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。
通过填充的方法,当卷积核扫描输入数据时,它能延伸到边缘以外的伪像素,从而使输出和输入size相同。
常用的两种padding:
(1)valid padding:不进行任何处理,只使用原始图像,不允许卷积核超出原始图像边界
(2)same padding:进行填充,允许卷积核超出原始图像边界,并使得卷积后结果的大小与原来的一致
卷积过程中,有时需要通过padding来避免信息损失,有时也要在卷积时通过设置的步长(Stride) 来压缩一部分信息,或者使输出的尺寸小于输入的尺寸。
Stride的作用: 是成倍缩小尺寸,而这个参数的值就是缩小的具体倍数,比如步幅为2,输出就是输入的1/2;步幅为3,输出就是输入的1/3。以此类推。
3️⃣
在图像处理中,卷积经常作为特征提取的有效方法。一幅图像在经过卷积操作后得到结果称为特征映射。
CNN基本模块
CNN由输入和输出层以及多个隐藏层组成,隐藏层可分为卷积层,池化层、RELU层和全连通层。
输入层
CNN的输入一般是二维向量,可以有高度,比如,RGB图像。
卷积层
卷积层是CNN的核心,层的参数由一组可学习的滤波器(filter)或内核(kernels)组成,它们具有小的感受野,延伸到输入容积的整个深度。
传统神经网络层之间都采用全连接方式,如果采样数据层数较多,且输入又是高维数据,那么其参数数量可能将是一个天文数字。
比如训练一张1000×1000像素的灰色图片,输入节点数就是1000×1000,如果隐藏层(除输入层和输出层以外的其他各层)节点是100,那么输入层到隐藏层间的权重矩阵就是1000000×100,权重矩阵的参数非常多,训练的效率会非常低!如果还要增加隐藏层,进行反向传播,那结果可想而知😫。不止如此,采用全连接方式还容易导致过拟合。
而卷积层就轻便多啦~
- 局部连接——在卷积层中的每一个神经元都只和下一层中某个局部窗口内的神经元相连,构成一个局部连接网络,卷积层和下一层之间的连接数大大减少
- 权重共享——如图(b),所有的同颜色连接上的权重是相同的。因此,权重共享可以理解为一个卷积核只捕捉输入数据中的一种特定的局部特征,如果要提取多种特征就需要使用多个不同的卷积核。
简单来说,卷积层的作用是提取一个局部区域的特征,不同的卷积核相当于不同的特征提取器。 为了提高卷积网络的表示能力,可以在每一层使用多个不同的特征映射,以更好地表示图像的特征。
池化层
池化层(Pooling Layer),还叫汇聚层/子采样层(Subsampling Layer),其作用是进行特征选择,降低特征数量,从而减少参数数量。
卷积层虽然可以显著减少网络中连接的数量,但特征映射组中的神经元个数并没有显著减少。如果后面接一个分类器,分类器的输入维数依然很高,很容易出现过拟合。为了解决这个问题,可以在卷积层之后加上一个池化层,丢掉一些不是那么重要的特征,从而降低特征维数,避免过拟合。
RELU层
RELU全名修正线性单元,是神经元的激活函数,对输入值x的作用是max(0,x),当然RELU只是一种选择,还有选Leak-Relu等等,一般都是用Relu!
全连接层
全连接层就是一个常规的神经网络,它的作用是对经过多次卷积层和多次池化层所得出来的高级特征进行全连接(全连接就是常规神经网络的性质),算出最后的预测值。
输出层
输出层就是对结果的预测值,一般会加一个softmax层。
softmax层
顾名思义👀
max——就是我们熟悉的取输出结果的最大值soft——如果只有max,那可能会导致分类非黑即白,最后的输出是一个确定的变量,这样显然是不科学的🥶。加入soft使最后的输出是每个分类被取到的概率,max取出概率大的结果。