深度学习《CNN架构》

摘要:今天来写第一篇深度学习的博文,也是学习CNN的第一篇。
骚话一下:
今天是2020年10月1号,是祖国的71岁生日,也是传统节日中秋节,而我由于工作的安排身在海外不得回家,怀念祖国的乡土,倍加思念远方的亲人。
由于疫情,在这里哪里也去不了,只能好好学习,用学习来充实这八天假期。

一:CNN的灵感起源
也许CNN就是深度学习过程中的必须且最基础的网络结构了,下面我们先来回顾下传统的神经网络的网络结构。
在这里插入图片描述
每一层的节点都是和前一层或者后一层的每个节点都是相连接的,分为输入层,隐藏层和输出层。我们所学习的CNN在层次结构和层次深度上都是发生了改变,但也是一种网络,是在传统神经网的基础上发展出来的一种新的网络,其灵感来自于脑神经。

人类的视觉原理是这样的:从原始的像素信号摄入开始,接着做初步处理(大脑皮层某些细胞发现图像的边缘和方向),然后进一步抽象(大脑判定物体的形状),然后进一步抽象(大脑进一步对物体进行识别)。如下图是一个人脸识别的例子:
在这里插入图片描述
我们的大脑视觉神经是逐层分级的,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。
CNN的灵感就是来自于大脑神经细胞视觉分层处理,模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类。

也可以说是,我们看物体不是一上来就是全部,而是第一反应是看到了某个区域,再看到另外个区域,逐渐由多个区域拓展到整体,不断抽取特征组合起来,最后发现视觉范围内的所有信息。

二:CNN的结构
上面我们提到了传统神经网络的结构图,我们可以建立不同维度的层次节点,通过前向传播和后向传播直接训练出一个网络模型。
先来看看CNN的网路结构,以著名的先驱者网络LeNet-5网络为例。

在这里插入图片描述

其层次结构包含如下:
1)数据输入层(input layer)
2)卷积计算层(Conv layer)
3)激活层(activate layer)
4)池化层(pooling layer)
5)全连接层(Fully connection)
6)损失层(softmax loss layer)

我们可以发现,传统的神经网络存在于CNN的最后一层结构,也就是CNN在传统的神经网络前加了很多其他的不同的层次结构,下面我将分别进行描述各个层次。

三:数据输入层
CNN主要运用于图像的处理,这里的数据输入主要是对图像进行一些预处理,比如我们常见的二值化处理,灰度化处理,去均值化处理,PCA降维处理(保留主要特征),还有一些归一化(去除由于各个维度的范围差异带来的干扰)的处理,甚至我们的图像还可以保留RGB三色通道也是可以。
根据自己的设计,设计出一些其他的预处理细节,还比如统一尺寸大小等。

四:卷积计算层
至于卷积的含义,以及在连续数据的卷积和离散数据的卷积概念和公式我就不说了,不清楚的化请自行百度,我就直接上过程,直接给出图像的卷积,这一层也是非常重要的概念,CNN的名字也是来源于此,所以这里会多讲一些。
至于对图像的卷积操作,可以参考上一篇发的相关文章《图像卷积》。
这里需要对卷积层注意几个问题。

1)维度表示问题
2)Padding问题
3)Stride问题

下面我通过这个示例图来进行详细说明:
在这里插入图片描述
用上图来表示一下,我们先来一些定义:
1:Input_channel:[N, W, H, C]
N:输入层的图像个数
C:输入层的每个图像的通道数,比如每个彩色图像的RGB三通道
W:输入层图像的宽度
H:输入层图像的高度
如上图:输入层仅一个图像,维度可表示为[1,7,7,3]

2:Kernel_ channel:[M, W, H, C]
M:卷积个数。这kernel也可以叫做过滤器Filter。
C:每一个卷积的通道数,这个需要和输入层的每个图像的通道数保持一致。
W:kernel的宽度
H:kernel的高度
某个输入层图像Img和某个卷积kernel_K 做卷积,因为通道相同,于是将对应的通道进行卷积再相加就可以得到一个输出图像X,X作为该卷积的一个输出。那么某个Img跟所有卷积对应的通道卷积再相加后会得到M个X的图像输出,这些X就是该原始图像Img卷积后对应于输出层的新的通道,输出层的通道数就一共有M个。
该层卷积层全部完成后,输出层的图像的个数是依然N,每个图像的通道数是M,至于输出层图像的大小是多少,且看后续分析。
如上图:卷积层有2个,每个卷积层3个通道,维度可表示为[2,3,3,3]

3:Bias:[M, 1, 1, 1]
M:和卷积个数一致,都是一个数字,或者是一个111的矩阵,分别对应于某个卷积核。当某个Img和某个kernel_K对应通道卷积后,再相加,还需要和这个Bias进行相加,作为图像的整体偏置,该参数可选。
如上图:卷积层有2个,所以偏置也有两个,维度可表示为[2,1,1,1],分别对应于某个卷积核。

4:Padding:输入层的图像外围补0的层数。

5:Stride:在卷积过程中,kernel滑动的步长。

由于,卷积得到的图像的大小会有降低,如果那个让图像大小降低的话,就可要使用padding技巧,边界的填充,一般选择补0进行填充。比如,32x32的图像,经过5x5的卷积,就得到了一个28x28的图像,因为我们没法对原图像外层的像素进行卷积,因此,我们还可以对原图像进行补0操作,比如给图像外层补上2圈0,原图像变成了36x36,卷积后,依然是32x32的大小。记做P=2,P是补充的0的圈数。

Stride是步长的意思,也就是卷积核没有刺激在原图像上的移动的步长,默认是1个像素,也可以设置为其他值,如果stride>1,那么得到的图像也会缩小大小。比如原图像32x32,步长为2卷积,那么得到的图像大小是16x16。记做S=2,S是卷积滑动的步长。

在这里插入图片描述

五:激活层
一层节点得到了输入,如果要输出传递给下一层网络之前,一定是需要一个激活层的,在我们学习过的传统的神经网络也是经过见到的,那时候我们用的是sigmoid函数,其实有很多可选。
在DL中,我们可选的激活函数也有很多,在此我列举了四个激活函数。
1)sigmoid函数
在这里插入图片描述

2)tanh函数

在这里插入图片描述

3)Relu(Rectified Liner Uint)函数

在这里插入图片描述

Relu具有求导容易,梯度下降时候计算快,且避免了前俩函数在网络深度很深的情况下的梯度消失的问题(浅显的网络可以考虑继续使用前俩激活函数),因此在深度网络中明收敛速度也会快。这个问题后面会讲解。
其缺点就是 Relu的输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,也就是神经元不学习了,这种现象叫做“Dead Neuron”。为了解决Relu函数这个缺点,在Relu函数的负半区间引入一个泄露(Leaky)值,所以称为Leaky Relu函数。

4)Leaky Relu函数

在这里插入图片描述

除此之外还有ELU【指数线性单元】、PReLU【参数化的ReLU 】、RReLU【随机ReLU】等激活函数,这里不一一列举。

ReLU是目前最常用的激活函数。

六:池化(Pooling)层
为了减少参数,CNN设计了一个采样层,或者也可以叫做池化层,为了就是将上一层的输入减少,参数也提取减少。主流的分下面三个

1)Subsample:下采样,就是对上层图像进行隔行隔列采样,这样能原来图像缩小一倍。

2)MaxPooling:用一个F*F的窗口进行采样,Stride也是设置为F,在每一个窗口内,取像素的最大值,作为输出像素。

3)AvgPooling:用一个F*F的窗口进行采样,Stride也是设置为F,在每一个窗口内,取像素的和计算平均值,作为输出像素。

下面用一个窗口大小2*2,Stride=2的举例,截图自视频。
在这里插入图片描述

七:全连接层(Fully Connection)
这一层跟传统的神经网络一致,但是层次一般也不会特别深了,前面的大量的卷积,池化,ReLu层过后,基本已经提取了数据的特征,在FC层之前呢,都叫做特征提取层,FC层才叫做真的训练分类层。这里的反向传播算法跟之前学习神经网络时候的推导基本是一样的,都是需要求导的链式法则,从输出层一层层反向传播。具体求导这里先不自己说,后面会在PyTorch实践中说明。

八:损失层
这个是CNN的最后一层,计算模型输出和实际预期的差距和代价损失,这里介绍一种新的对分类问题的代价计算方式,softmax loss。这里会稍微详细介绍下这个损失函数的计算方式和求导过程,分为分类和回归两种。
假设输出层有C个输出,在输出层,暂时不设置激活函数,因为下面我们要讨论的是softmax激活,我们希望在分类问题中,归一化成概率描述,就是C个分类,我们希望得出每个分类的概率是多少,挑选出最大的那个概率作为分类结果,而且整个概率相加是1,看似还是很自然的。那么就有个归一化的过程。来看看具体的具体计算吧。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

至此得到了,最后损失层的代价损失求导过程,在后面梯度下降过程的过程中是有用到的。

至于回归问题的代价计算方式,还是使用平方差误差的计算方式。

九:训练过程
参数初始化:参数需要随机初始化,随机初始化到比较小的数,根据经验,切记不要随机初始化到0,不然每一层的每一个节点都会表现一样。这样是没有意义的。

反向传播,这里需要根据自定义的网络结构,数学工程,根据连发求导法则自行推导出每个参数的偏导数,利用梯度下降来搞定。这个后面的文章我会详细说明。因为梯度下降也有一些优化的技术,比如Batch梯度下降 / 随机梯度下降 / mini-Batch梯度下降,momentum, RMSprop,Adam,学习率衰减等优化技术。这些我后面会专门写一篇。

正则化技术:这是为了防止过拟合,这个后面我也会专门写一篇详细说明,这个一般情况下,L2正则化,之前也写过,就基本足够了,但是还有一个更为先进的方法,dropout方式,以及其他的一些防止过拟合的方式。

十:其他先进的技术
1)batch normalization
2)skip connection
3)group convolution
4)1*1卷积运用
这些内容不铺开,依然是留给后续的文章讲解,我不想让一篇文章过于长了。

十一:经典的一些网络设计
著名的网络包括:LeNet5,AlexNet,VGG,ResNet。
这里依然留给后面再讲解,希望能从别人的设计中汲取一些思想,哪怕一点点。

最后感谢如下文章对我的帮助
学习文档/视频来自于:
https://www.jianshu.com/p/1ea2949c0056
https://www.cnblogs.com/alexcai/p/5506806.html
https://blog.csdn.net/weixin_38368941/article/details/79983603
https://blog.csdn.net/jiaoyangwm/article/details/80098866
https://blog.csdn.net/jiaoyangwm/article/details/80011656
https://blog.csdn.net/luoxuexiong/article/details/90062937
https://blog.csdn.net/chaipp0607/article/details/101946040
https://www.cnblogs.com/makefile/p/dropout.html
https://v.qq.com/x/page/f03734am317.html

猜你喜欢

转载自blog.csdn.net/qq_29367075/article/details/108896025