摘要:今天来写第一篇深度学习的博文,也是学习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架构》相关推荐

  1. 深度学习之自编码器(4)变分自编码器

    深度学习之自编码器(4)变分自编码器 1. VAE原理  基本的自编码器本质上是学习输入 x\boldsymbol xx和隐藏变量 z\boldsymbol zz之间映射关系,它是一个 判别模型(Di ...

  2. 深度学习之自编码器(5)VAE图片生成实战

    深度学习之自编码器(5)VAE图片生成实战 1. VAE模型 2. Reparameterization技巧 3. 网络训练 4. 图片生成 VAE图片生成实战完整代码  本节我们基于VAE模型实战F ...

  3. 深度学习之自编码器AutoEncoder

    深度学习之自编码器AutoEncoder 原文:http://blog.csdn.net/marsjhao/article/details/73480859 一.什么是自编码器(Autoencoder ...

  4. 深度学习之自编码器(3)自编码器变种

    深度学习之自编码器(3)自编码器变种 1. Denoising Auto-Encoder 2. Dropout Auto-Encoder 3. Adversarial Auto-Encoder  一般 ...

  5. 深度学习之自编码器(2)Fashion MNIST图片重建实战

    深度学习之自编码器(2)Fashion MNIST图片重建实战 1. Fashion MNIST数据集 2. 编码器 3. 解码器 4. 自编码器 5. 网络训练 6. 图片重建 完整代码  自编码器 ...

  6. 深度学习之自编码器(1)自编码器原理

    深度学习之自编码器(1)自编码器原理 自编码器原理  前面我们介绍了在给出样本及其标签的情况下,神经网络如何学习的算法,这类算法需要学习的是在给定样本 x\boldsymbol xx下的条件概率 P( ...

  7. 【深度学习】 自编码器(AutoEncoder)

    目录 RDAE稳健深度自编码 自编码器(Auto-Encoder) DAE 深度自编码器 RDAE稳健深度自编码 自编码器(Auto-Encoder) AE算法的原理 Auto-Encoder,中文称 ...

  8. 深入理解深度学习——Transformer:编码器(Encoder)部分

    分类目录:<深入理解深度学习>总目录 相关文章: ·注意力机制(AttentionMechanism):基础知识 ·注意力机制(AttentionMechanism):注意力汇聚与Nada ...

  9. 深度学习之自编码器实现——实现图像去噪

    大家好,我是带我去滑雪! 自编码器是一种无监督学习的神经网络,是一种数据压缩算法,主要用于数据降维和特征提取.它的基本思想是将输入数据经过一个编码器映射到隐藏层,再通过一个解码器映射到输出层,使得输出 ...

  10. 深度学习:自编码器、深度信念网络和深度玻尔兹曼机

    最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来,欢迎大家关注我的 个人博客,以及我的github. 本文主要讲解有关自编码器.深度信念网络和深度玻尔兹曼机的相关知识. 一.自编码器 1. ...

最新文章

  1. 数学建模——ARIMA时间序列预测模型Python代码
  2. 算法之------搜索篇
  3. (TPC-H测试 SF=10,SF=200) PostgreSQL 11 vs 10 vs Deepgreen
  4. 2017 Material design 第三章第四节《字体与排版》
  5. DH参数(Denavit-Hartenberg parameters)
  6. python贪吃蛇_python实现贪吃蛇
  7. android软件画面共享,安卓两台手机怎么实现屏幕共享?安卓两台手机实现屏幕共享教程...
  8. php rabbitmq延迟队列实现
  9. [转载]实时 Java,第 5 部分: 编写和部署实时 Java 应用程序
  10. 微信公众平台开发教程(一) 微信公众账号注册流程
  11. 《人月神话》8 胸有成竹(Chaptor 8.Calling the Shot -The Mythical Man-Month)
  12. 超级玛丽3号max即将停售70版本,到底保障如何,值不值得购买呢
  13. php中文输出有乱码怎么办,php中文输出乱码怎么办
  14. Bootstrap框架和vue哪个好-天道酬勤
  15. 学计算机类专业对电脑有要求,大学设计专业电脑配置须知
  16. aniso8601库
  17. 用分数形式精确表达有理数和循环无理数
  18. 中山培训学校python
  19. 笔记本电脑插入USB鼠标键盘失效问题解决
  20. shell 查看文件大小 du -sh 文件名

热门文章

  1. Linux下尝鲜IDE Rider .NET又一开发利器
  2. Sqli-labs less 47
  3. Atitit .h5文件上传 v3
  4. 关于SEL的简单总结
  5. Android中scrollview的scrollto方法不起作用的办法
  6. hdu 5017 Ellipsoid(西安网络赛 1011)
  7. 在 SELECT 查询中使用表表达式
  8. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组...
  9. php执行多个存储过程
  10. Android开发中的logcat工具使用方法