CNN(卷积神经网络)

一、卷积神经网络

1、CNN的基本知识

1、卷积神经网络(Convolutional Neural Networks,CNN)的作用:
    1.cnn跟全连接的区别:原来一个输出神经元的计算是跟所有输入层的神经元相连,现在只是局部输入层的
                        神经元相连;同一所个通道中所有神经元的计算共享同一组权重和偏置

    CNN可以有效的降低 传统深度神经网络 参数量与计算量。
    2.FC DDN 参数量与连接数:
        参数量 = 连接数 = 输入featureMap总特征数(尺寸) * 输出featureMap总特征数(尺寸)
 
    3.CNN参数量(卷积核):  跟模型总的训练时间和次数有很大关系,参数量越多花的训练时间越长,越难训练;
                      参数量就是W数(卷积核尺寸,例:3*3*3*2)
      CNN链接数量(卷积): 跟当次训练的时间有关,越多计算量越大,训练时间越长;
                      连接数的数量就是参数量(即卷积核的大小)*输出层的尺寸(卷积核大小)*输出层的尺寸。 
                      注意b加的位置就是每一个输出通道所有输入通道计算结果总和 + b

      CNN下采样(池化)的连接数: filter尺寸(4)*通道数*输出层的尺寸
      CNN全连接的连接量: 等于参数量,等于输入层尺寸(2维)*输入层通道数*输出尺寸(1维)
2、常见的CNN结构有:
    LeNet-5、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等等,其中在LVSVRC2015冠军ResNet是AlexNet的20多倍,
    是VGGNet的8倍;
    其中:AlexNet、ZFNet、GoogleNet 是过度的神经网络
         ① LeNet-5:结构最为简单,常用作小型简单的项目,例如嵌入式芯片常常用到LeNet-5
         ② VGGNet16、ResNet(151层):模型复杂,适合处理大型的项目,占用资源较高。
3、从这些结构来讲CNN发展的一个方向就是层次的增加,通过这种方式可以利用增加的非线性得出目标函数的近似结构,同时得出更好
    的特征表达,但是这种方式导致了网络整体复杂性的增加,使网络更加难以优化,很容易过拟合。
4、CNN的应用主要是在图像分类和物品识别等应用场景应用比较多
https://cs231n.github.io/assets/conv-demo/index.html
卷积核设计:
1.输入层是7*7*3    3称为通道数 channel(程序中、图像中),又称厚度(depth、ppt、书), 也称  featureMap数  (论文/ppt) 
    例:
        黑白图片:28*28*1
        彩色图片:28*28*3   ---- RGB三色
2.卷积核的大小(3*3*3*2):第一个3是H(高),第二个3是W(宽),第三个3是输入层的通道数,第四个2是输出层
                   的通道数,也就是说卷积核的大小包含着 输入通道数*输出通道数,所以卷积核的大小    
                   就是参数量;卷积核的尺寸不能比输入层的尺寸大(否则称之为反卷积);

3.卷积核的个数     以共享的w为基础确定,同一种权重组成的卷积核称同一个卷积核,3*3*3*2有2个卷积核
                   输出层的通道数有多少个就有多少个卷积核,一个卷积核对应一种特征
4.卷积核3*3*3*2    卷积核尺寸前两个3是可以自己设计和改变的,第三个3是输入通道数,是不能改变的,第
                   四个2是输出通道数,是可以改变和设计的
5.CNN网络的连接数:见下图
6、CNN网络连接数与参数量对 迭代时间与迭代次数的影响:
    CNN连接数:主要影响 1次迭代 BP时 迭代时间
    CNN的参数量:主要影响 总体迭代时间 与 迭代次数

  卷积核工作流程查看网址:https://cs231n.github.io/assets/conv-demo/index.html

CNN(卷积神经网络)_第1张图片


1.激活函数的使用: 在隐层尽量使用tanh和relu,只有在全连接或输出层使用sigmoid/softmax;tanh和relu究竟
                   哪个适应你的模型,要通过实验决定

2.池化:           又称下采样,一般都会减少输入层的尺寸,池化不改变输入层通道数,池化没有w和b;
                   深度学习论文中提到的深度学习网络的层数一般不包含池化层;每通过一次池化,数据量
                   会减少从而减少计算量,每通过一次池化,卷积层特征都能学到很大范围更轮廓性的特征;
                   池化一般都是2*2,很少有别的尺寸
3.多次卷积和池化: 是为了从细节特征,过渡到学习更轮廓性的特征
4.BN:              batch中所有样本同一维特征进行归一化;普遍加速运算;某些深度学习网络提高精度
                   一般放在激活函数的后面
5.dropOut:         解决过拟合的问题;输入和输出节点任何位置都可以被随机置0;任何地方的w,b都不能置0;
                   隐层神经元都可以随机置0;keep_prob=0.7;一般区间取[0.5,09];这里的删除是置0的意思,
                   不是真正从物理上删除节点或神经元;加入了dropout一次训练时间会减少,但是要降低到
                   相同的loss,总的时间会增加;

6.样本不均衡:     1.取类别中样本数最多的那类样本的个数N=5,作为每个类最后要达到的样本数量;
                   2.蓝x1=shuffle(0,1,2,3,4) 橘色x2 = shuffle(0,1,2,3,4) 绿x3=shuffle(0,1,2,3,4)
                   3.取模x1 mod 3(原来蓝色是3个)       x2 mod 2  x3 mod 5 作为输出
7.batch_size:      设定范围4~100不等,要通过实验得出较好的,对精度无大的影响;对训练速度有影响;对
                   内存大小有要求(防止内存溢出,就要减少batch_size,减少参数量)
8.lr学习率  :     最重要的调参对象,学习率过大,loss会下降到一个较高的值就开始上升;如果过小,下降
                   到一个较高的值就不能再降了,但也不会上升;只有合适才能使得loss降低到很小
                   深度学习跑飞了是指loss不降反升

9 Inception:       将传统的串行结构变为并行结构,在达到同样效果的情况下,需要更少的参数量;每次计算
                   需要的时间更少(因为能局部并行计算);concat是矩阵的拼接,拼接的矩阵拼接至少有一个
                   维度的长度要相同(到程序或项目中展开);
                   通过加入一个小尺寸的卷积核(1*1),将原始的输入层的通道进行压缩(降维),达到减少参数量
                   的目的;压缩是有信息损失的,压缩有经验的比例大约(1,10]之间,不能太大              
10 目前流行结构:  Inception主要是图像视觉和语音;resnet主要是图像视觉和语音;膨胀卷积全领域;
                   seq2seq主要自然语言处理

11. 网络结构场景: LeNet是在简单的场景中应用(手写字、验证码识别);AlexNet、ZFNet、GoogleNet基本不用了;
                   VGGNet和ResNet用在大型项目中,如人脸识别、目标检测、语音识别等;inception-resnet
                   是目前最先进的结构之一,通常用在大型项目中,用在人脸识别、目标检测、语音识别;
12. 作业:         熟悉inceptionV3 inceptionV4
13. 拉平op:        7*5*50 ,一定是先拼接50 再拼接5 最后拼接7
自然语言处理必须:
1 章    
2 章
5 章
7 章
8 章
9 章

提高:
6 章
10-16除了第12章

大神:
1. 卷积核设计
2. 深度学习网络设计
3. 网络调参
4. 网络优化
5. 算法建模
6. 算法创新
 
测试:
placeholder None变为-1;   reshape的-1变为None  


RNN:
1. 与CNN不同,CNN只有隐层与隐层之间有联系,有W,b,叫竖直方向联系;RNN除了隐层与隐层之间有联系有权重w,b之外(竖直方向
    联系),输入序列之间也有关联,有权重U,b(横向联系),也即记忆能力; 
2.    

2、CNN设计的基本思想

一般的CNN结构依次为:  --------- 也可能中间加 BN 层
    INPUT
    [[CONV -> RELU] * N -> POOL?]*M
    [FC -> RELU] * K
    FC

注意:通常激励层是整合到 CONV层内部的,因为做了卷积层一定会进行激励,他们是成对出现的。
  •       简单的CNN结构

CNN(卷积神经网络)_第2张图片

  •     为什么采用上述 多层卷积加上池化
1、问题一:为什么用 多层  卷积层(包含激励层)+ 池化层 ?
    ① 第一个原因很明显,卷积核的局部感知的输出通道数逐渐增加,如果还是用最初的 featureMap尺寸就会有大量的参数连
      接,而池化通过减小featureMap的尺寸可以有效减少卷积核的参数连接。
    ② 第二原因:卷积核提取特征是局部感知,这是我们都知道的,也就是说在卷积核大小不变的情况下featureMap的尺
      寸越大,局部获取 原图的特征就越少,而池化减小featureMap的尺寸可以使得卷积核获取更多的 原图的局部特征。
      一个很明显的特点就是随着卷积池化层数增加,原有 的featureMap就变成了的许多个黑白原图缩减图
2、问题二:为什么在一个Pooling层前面有多个卷积层?
     Pooling层前面有多个卷积层是 为了更多的提取样本图片的特征后再池化。也可以再pooling前加入一层卷积层。

CNN(卷积神经网络)_第3张图片

 二、CNN网络的基本结构

   1、CNN网络的基本结构

 数据输入层:Input Layer
 卷积计算层:CONV Layer  ------ CNN网络的参数层
 ReLU激励层:ReLU Incentive  Layer
 池化层:Pooling Layer
 全连接层:FC Layer
 备注:Batch Normalization Layer(可能有)

 2、数据输入层

1、数据输入层:输入样本的特征向量(与FC DNN 不同的是,CNN输入特征向量时结构通常为:高*宽*通道数  的三维结构)

 (1)CNN网络输入数据预处理

1、神经网络/机器学习一样,需要对输入的数据需要进行预处理操作,需要进行预处理的主要原因是:
     ① 输入数据单位不一样,可能会导致神经网络收敛速度慢,训练时间长    
     ② 数据范围大的输入在模式分类中的作用可能偏大,而数据范围小的作用就有可能偏小:
         解决手段:归一化  [0,1] 
     ③ 由于神经网络中存在的激活函数是有值域限制的,因此需要将网络训练的目标数据映射到激活函数的值域,S形激活函数
       在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X),f(100)与f(5)只相差0.0067

(2)常用数据预处理的方式

             https://blog.csdn.net/f110300641/article/details/85099520 

             https://blog.csdn.net/hongxue8888/article/details/78775078/

1、常见3种数据预处理方式:
    ① 去均值(中心化)
      将输入数据的各个维度中心化到0
    ② 归一化
      将输入数据的各个维度的幅度归一化到同样的范围
    ③ 正态化:
      去均值也去方差   (x - np.mean(x))/np.std(x)
    ④ PCA/白化
        用PCA降维(去掉特征与特征之间的相关性)
        白化是在PCA的基础上,对转换后的数据每个特征轴上的幅度进行归一化
http://ufldl.stanford.edu/wiki/index.php/白化

CNN(卷积神经网络)_第4张图片

(3)CNN常用到的 两种数据预处理方式图解

1、CNN网络中一般采用系列两种数据预处理方式:
    ① 先中心化 后 归一化
    ② 白化(PCA >>> 归一化)
    注意:第一种方法使用居多

  CNN(卷积神经网络)_第5张图片

CNN(卷积神经网络)_第6张图片

 备注:虽然我们介绍了PCA去相关和白化的操作,但是实际上在卷积神经网络中,一般并不会适用PCA和白化的操作,一般去均值
    和归一化使用的会比较多。
 建议:对数据特征进行预处理,去均值、归一化.

 

CNN(卷积神经网络)_第7张图片

 

 

 3、卷积计算层  ------- CNN网络的参数层

1、卷积计算层是局部感知提取特征,他是一个分布式的(多个输出通道),所以需要FC层将这个局部感知的结果进行合并 到样本
    的标签空间。

(1)卷积核filter与计算方式

1、卷积核(filter):又名filter
    ① 卷积核的概念:用来计算各层输入数据与输出数据的参数,代替FC DNN中的 w矩阵。
    ② 卷积核存在的意义: 为了代替全连接DNN中的参数矩阵叉乘的方式,减少了网络参数的数量和总体的计算量
2、卷积核的几个注意点:
    ① 卷积核的初始对应位置(padding :VALID 或 SAME)
    ② 卷积核的尺寸、中心点
        卷积核常见的尺寸:3*3    5*5   7*7  11*11 15*15   ------ 注意:其实卷积核的大小也包含了 输入通道数和输出
                                                                通道数,这里假设这两者均为1。
        filter尺寸构建策略:
              a 卷积核高与宽的设定:经验值,具体情况根据业务需求
                    优先:质数 * 质数,  其次:奇数*奇数 奇数*质数,    最后:偶数 * 偶数
              b 卷积核的设计尽可能的小:可以采取多个小的卷积核在代替大的卷积核。
              c 通常我们使用正方形的卷积核,但需要知道的是:当数据存在着较多噪声数据时,不规整的卷积核可以降低噪声。

    ③ 卷积核移动步长 stride:
        注意:当计算下一次卷积运算时,卷积核的参数不变,只是滑动了一定的步长。
    

CNN(卷积神经网络)_第8张图片

(2)卷积核Padding

观察上图卷积计算后,我们会发现最外围有一圈数据没有计算到,针对这种情况,常见有两种处理方式:

  • 第一种:padding:VALID                 --------- 删除边缘数据

CNN(卷积神经网络)_第9张图片

              padding :VALID  后 输出 imge 与 原始 imge 尺寸的关系 : 

CNN(卷积神经网络)_第10张图片

  • 第二种:padding:SAME 

CNN(卷积神经网络)_第11张图片

             padding :SAME 后 输出 imge 与 原始 imge 尺寸的关系 :

CNN(卷积神经网络)_第12张图片

(3)卷积层的作用,为什么用卷积层

1、卷积层的特点:
    ① 减少了参数量和连接数,从而大大减少了模型的迭代次数与迭代时间。(减少了多少?参数量、连接参数的计算方式?参数
        量与连接数具体对模型训练的影响? ---- 详情见上文)
    ② 卷积层模拟了人视觉处理图像的运行方式:
        局部感知: 在进行计算的时候,将图片划分为一个个的区域进行计算/考虑;再利用高层次的神经网络对局部感知处
                  理的数据进行汇总。
        参数共享机制:假设每个神经元(指的是同一张featureMap)连接数据窗的权重是固定的
        滑动窗口重叠:降低窗口与窗口之间的边缘不平滑的特性。
        固定每个神经元的连接权重,可以将神经元看成一个模板;也就是每个神经元只关注一个特性

4、激励层reLu

常用非线性映射函数
    Sigmoid(S形函数)
    Tanh(双曲正切,双S形函数)
    ReLU
    Leaky ReLU
    ELU
    Maxout

                 https://blog.csdn.net/qq_16555103/article/details/97614879  ------ 各个激活函数的图像表达

(1)sigmoid激活 优缺点

1、优点:值域取值范围为 0-1 ,简单容易理解
    缺点:
        ① 容易出现饱和区,终止梯度传递(“死神经元”);
        ② sigmoid函数的输出没有0中心化。
1、sigmoid函数在实际梯度下降中,容易饱和和终止梯度传递。我们来解释一下,大家知道反向传播过程,依赖于计算的梯度,在一元
    函数中,即斜率。而在sigmoid函数图像上,大家可以很明显看到,在纵坐标接近0和1的那些位置(也就是输入信号的幅度很大
    的时候),斜率都趋于0了。我们回想一下反向传播的过程,我们最后用于迭代的梯度,是由中间这些梯度值结果相乘得到的,
    因此如果中间的局部梯度值非常小,直接会把最终梯度结果拉近0,也就是说,残差回传的过程,因为sigmoid函数的饱
    和被杀死了。说个极端的情况,如果一开始初始化权重的时候,我们取值不是很恰当,而激励函数又全用的sigmoid函数,那
    么很有可能神经元一个不剩地饱和到无法学习,整个神经网络也根本没办法训练起来。

2、sigmoid函数的输出没有0中心化,这是一个比较闹心的事情,因为每一层的输出都要作为下一层的输入,而未0中心化会直接影响梯
    度下降,我们这么举个例子吧,如果输出的结果均值不为0,举个极端的例子,全部为正的话(例如f=wTx+b中所有x>0),那么反
    向传播回传到w上的梯度将要么全部为正要么全部为负(取决于f的梯度正负性),这带来的后果是,反向传播得到的梯度用于权
    重更新的时候,不是平缓震荡地迭代变化,而是朝着某个方向去迭代。当然,要多说一句的是,这个缺点相对于第一个缺点,还
    稍微好,第一个缺点的后果是,很多场景下,神经网络根本没办法学习。

             CNN(卷积神经网络)_第13张图片   CNN(卷积神经网络)_第14张图片

  (2)tanh激活 优缺点

tanh的有优缺点:
    优点:
        ① tanh输出的值域范围为 -1 - +1,容易理解
        ② 输出值 0 中心化(输出值会作为下一层的输入值),方便神经网络的训练 残差平滑更新
    缺点:
        ① 和sigmoid激活一样,tanh激活同样存在着饱和区,饱和区处容易出现死神经元。

                          CNN(卷积神经网络)_第15张图片   CNN(卷积神经网络)_第16张图片

(3)reLu激活 优缺点

ReLU函数是从生物学角度,模拟出脑神经元接收信号更加准确的激活模型。
 相比于Sigmoid函数,具有以下优点:
     1. 单侧抑制;      ------ 左侧抑制了一些特征x
     2. 相对宽阔的兴奋边界;  ------ 右侧有着较大的兴奋区(虽说被截断了一部分,输出抑制到一个值,但是梯度仍为 1 )
     3. 稀疏激活性;    ------ 左侧为饱和区,抑制一部分神经元
     4. 更快的收敛速度; -------- 梯度右侧恒为 1 ,不用计算

CNN(卷积神经网络)_第17张图片

 

1、对于输入的x以0为分界线,左侧的均为0,右侧的为y=x这条直线。
     缺点:
         ① 没有边界,可以使用变种ReLU: min(max(0,x), 6)。截取经验值为: 5  6  20
         ② 比较脆弱,比较容易陷入出现”死神经元”的情况
                    解决方案:较小的学习率
     优点:
         ① 相比于Sigmoid和Tanh,提升收敛速度(因为ReLU的梯度为1,不用计算)
         ② 梯度求解公式简单,不会产生梯度消失和梯度爆炸
               解释:1) ReLU曲线本身会造成梯度爆炸,为什么呢?
                    反向BP梯度的传递与两个值有关(激活函数的梯度 * 上一层激活函数的输出值),ReLU梯度 = 1,没什
                    么问题,但是ReLU函数的右侧没有边界,这就导致ReLU激活层的输出值可能无限大,因此他们的乘积还
                    是会产生梯度爆炸,因此我们通常使用ReLU的变种 ReLU: min(max(0,x), 6),通过截取右侧的取值来
                    抑制梯度爆炸。
                   2) ReLU曲线会造成梯度消失吗?
                    ReLU 会产生死神经元(左侧),但是他不会产生梯度消失,ReLU本身没有接近于 0 很小的梯度(ReLU 的
                    梯度 == 1),它不会出现 随着梯度的乘积越来越小的现象。

(4)Leaky ReLU 优缺点

CNN(卷积神经网络)_第18张图片

(5)ELU 优缺点

CNN(卷积神经网络)_第19张图片

(6)Maxout 优缺点

                 参考:https://arxiv.org/pdf/1302.4389.pdf

CNN(卷积神经网络)_第20张图片

CNN(卷积神经网络)_第21张图片

(7)激励层 激活函数选择的建议

1、CNN尽量不要使用sigmoid,如果要使用,建议只在全连接层使用
2、隐层首先使用ReLU(有时用tanh),ReLU迭代速度快,但是有可能效果不佳
3、如果使用ReLU失效的情况下,考虑使用Leaky ReLu或者Maxout,此时一般情况都可以解决啦
4、tanh激活函数在某些情况下有比较好的效果,但是应用场景比较少

5、池化层(pooling),又称下采样

1、在连续的卷积层中间存在的就是池化层,主要功能是:
    通过逐步减小featureMap尺寸来减小参数量和网络中的计算;
    池化层在每个特征图上独立操作,使得下一层的卷积核可以更高的层次提取特征,减小过拟合。
2、池化层的特点:
    ① pooling 没有添加新的w b参数,有些文章中并不把pool作为CNN网络设计层数
    ② pooling 没有改变通道数(channel)
3、一般的CNN结构依次为:  --------- 也可能中间加 BN 层
    INPUT
    [[CONV -> RELU] * N -> POOL?]*M
    [FC -> RELU] * K
    FC

CNN(卷积神经网络)_第22张图片

(1)池化核 ----- 一般为 2*2 

在池化层中,进行压缩减少特征数量的时候一般采用两种策略:
    Max Pooling:最大池化,一般采用该方式
    Average Pooling:平均池化

CNN(卷积神经网络)_第23张图片

6、卷积神经网络-Batch Normalization Layer 

1、Batch Normalization Layer(BN Layer)是期望我们的结果是服从高斯分布的,所以对神经元的输出(即所有样本的 列特征)
    进行一下标准正态化修正(mean = 0,std = 1)
2、BN层的作用:
    ① 增加网络的泛化能力(参考多项式扩展的线性回归,参数θ较大的时候容易造成偏置误差)
    ② 减少样本数据范围且使数据中心化,解决反向BP的导链偏置问题,加快网络的迭代速度
    ③ 一定程度上解决的梯度爆炸的问题

CNN(卷积神经网络)_第24张图片

 7、FC层(合并 分布式卷积核提取的局部特征)

1、类似传统神经网络中的结构,FC层中的神经元连接着之前层次的所有激活输出;换一句话来讲的话,就是两层之间所有神经元都
    有权重连接;通常情况下,在CNN中,FC层只会在尾部出现
2、CNN FC的作用:
    将前面卷积核提取的分布式局部特征 映射到 样本标签空间,FC层可能有多个      ------ 全局考量

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

、CNN网络实例结构

1、

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

池化层反向传播BP算法

CNN(卷积神经网络)_第25张图片

CNN(卷积神经网络)_第26张图片

数据增强(图片)

水平翻转:优点:从不同的角度来提取特征

CNN(卷积神经网络)_第27张图片

随机裁剪:优点:增加细节特征、模拟遮挡的实际场景

CNN(卷积神经网络)_第28张图片

PCA数据增强 

CNN(卷积神经网络)_第29张图片

样本不均衡 数据增强

CNN(卷积神经网络)_第30张图片

CNN(卷积神经网络)_第31张图片

CNN(卷积神经网络)_第32张图片

SGD、BGD、MBGD 学习率

CNN(卷积神经网络)_第33张图片  CNN(卷积神经网络)_第34张图片

学习率动态调优(现在大多是根据迭代次数epoch)

CNN(卷积神经网络)_第35张图片

momentum、SGD用到该公式手动动态调整学习率,实际工程中常用momentum,而其他优化器内部自动会优化调整学习率 

CNN(卷积神经网络)_第36张图片

 

 

 

 

CNN(卷积神经网络)_第37张图片

调整参数

CNN(卷积神经网络)_第38张图片

interception结构 

CNN(卷积神经网络)_第39张图片

VGG-NET

CNN(卷积神经网络)_第40张图片

res-NET

CNN(卷积神经网络)_第41张图片

CNN(卷积神经网络)_第42张图片

CNN(卷积神经网络)_第43张图片

为什么除了resNET 其他在一定层数后效果为变差

CNN(卷积神经网络)_第44张图片 CNN(卷积神经网络)_第45张图片

 

 

你可能感兴趣的:(AI_图像)