深度学习《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
深度学习《CNN架构》相关推荐
- 深度学习之自编码器(4)变分自编码器
深度学习之自编码器(4)变分自编码器 1. VAE原理 基本的自编码器本质上是学习输入 x\boldsymbol xx和隐藏变量 z\boldsymbol zz之间映射关系,它是一个 判别模型(Di ...
- 深度学习之自编码器(5)VAE图片生成实战
深度学习之自编码器(5)VAE图片生成实战 1. VAE模型 2. Reparameterization技巧 3. 网络训练 4. 图片生成 VAE图片生成实战完整代码 本节我们基于VAE模型实战F ...
- 深度学习之自编码器AutoEncoder
深度学习之自编码器AutoEncoder 原文:http://blog.csdn.net/marsjhao/article/details/73480859 一.什么是自编码器(Autoencoder ...
- 深度学习之自编码器(3)自编码器变种
深度学习之自编码器(3)自编码器变种 1. Denoising Auto-Encoder 2. Dropout Auto-Encoder 3. Adversarial Auto-Encoder 一般 ...
- 深度学习之自编码器(2)Fashion MNIST图片重建实战
深度学习之自编码器(2)Fashion MNIST图片重建实战 1. Fashion MNIST数据集 2. 编码器 3. 解码器 4. 自编码器 5. 网络训练 6. 图片重建 完整代码 自编码器 ...
- 深度学习之自编码器(1)自编码器原理
深度学习之自编码器(1)自编码器原理 自编码器原理 前面我们介绍了在给出样本及其标签的情况下,神经网络如何学习的算法,这类算法需要学习的是在给定样本 x\boldsymbol xx下的条件概率 P( ...
- 【深度学习】 自编码器(AutoEncoder)
目录 RDAE稳健深度自编码 自编码器(Auto-Encoder) DAE 深度自编码器 RDAE稳健深度自编码 自编码器(Auto-Encoder) AE算法的原理 Auto-Encoder,中文称 ...
- 深入理解深度学习——Transformer:编码器(Encoder)部分
分类目录:<深入理解深度学习>总目录 相关文章: ·注意力机制(AttentionMechanism):基础知识 ·注意力机制(AttentionMechanism):注意力汇聚与Nada ...
- 深度学习之自编码器实现——实现图像去噪
大家好,我是带我去滑雪! 自编码器是一种无监督学习的神经网络,是一种数据压缩算法,主要用于数据降维和特征提取.它的基本思想是将输入数据经过一个编码器映射到隐藏层,再通过一个解码器映射到输出层,使得输出 ...
- 深度学习:自编码器、深度信念网络和深度玻尔兹曼机
最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来,欢迎大家关注我的 个人博客,以及我的github. 本文主要讲解有关自编码器.深度信念网络和深度玻尔兹曼机的相关知识. 一.自编码器 1. ...
最新文章
- 数学建模——ARIMA时间序列预测模型Python代码
- 算法之------搜索篇
- (TPC-H测试 SF=10,SF=200) PostgreSQL 11 vs 10 vs Deepgreen
- 2017 Material design 第三章第四节《字体与排版》
- DH参数(Denavit-Hartenberg parameters)
- python贪吃蛇_python实现贪吃蛇
- android软件画面共享,安卓两台手机怎么实现屏幕共享?安卓两台手机实现屏幕共享教程...
- php rabbitmq延迟队列实现
- [转载]实时 Java,第 5 部分: 编写和部署实时 Java 应用程序
- 微信公众平台开发教程(一) 微信公众账号注册流程
- 《人月神话》8 胸有成竹(Chaptor 8.Calling the Shot -The Mythical Man-Month)
- 超级玛丽3号max即将停售70版本,到底保障如何,值不值得购买呢
- php中文输出有乱码怎么办,php中文输出乱码怎么办
- Bootstrap框架和vue哪个好-天道酬勤
- 学计算机类专业对电脑有要求,大学设计专业电脑配置须知
- aniso8601库
- 用分数形式精确表达有理数和循环无理数
- 中山培训学校python
- 笔记本电脑插入USB鼠标键盘失效问题解决
- shell 查看文件大小 du -sh 文件名