深度学习之卷积神经网络(Convolutional Neural Networks, CNN)

前面, 介绍了DNN及其参数求解的方法(深度学习之 BP 算法),我们知道DNN仍然存在很多的问题,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那么,人们又是怎么解决这个问题的呢?本节的卷积神经网络(Convolutional Neural Networks, CNN)就是一种解决方法.

    我们知道神经网络主要有三个部分组成, 分别为: 

  1. 网络结构 —— 描述神经元的层次与连接神经元的结构.
  2. 激活函数(激励函数) —— 用于加入非线性的因素, 解决线性模型所不能解决的问题.
  3. 参数学习方法的选择(一般为权重值W和偏置项b) —— 如BP算法等.

我们将主要从这几个方面进行讲述.

1 CNN的应用领域

CNN在以下几个领域均有不同程度的应用:

  1. 图像处理领域(最主要运用领域) —— 图像识别和物体识别,图像标注,图像主题生成,图像内容生成,物体标注等。
  2. 视频处理领域 —— 视频分类,视频标准,视频预测等
  3. 自然语言处理(NLP)领域 —— 对话生成,文本生成,机器翻译等
  4. 其它方面 —— 机器人控制,游戏,参数控制等

2 CNN的网络结构  

2.1 传统神经网络

上图为传统的神经网络的结构, 它是一种全连接的结构, 这也就造成了参数训练的难度加深. 还有BP求解中的可能出现的梯度爆炸和梯度消失的现象等.此外,深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源. 这些因素都造成了传统的神经网络的不适用性,所以没有较为广泛的运用.

2.2 卷积神经网络(Convolutional Neural Networks,CNN)

上图为CNN的网络结构,CNN可以有效的降低反馈神经网络(传统神经网络)的复杂性,常见的CNN结构有LeNet-5、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等等,其中在LVSVRC2015 冠军ResNet的网络层次是AlexNet的20多倍,是VGGNet的8倍;从这些结构来讲CNN发展的一个方向就是层次的增加,通过这种方式可以利用增加的非线性得出目标函数的近似结构,同时得出更好的特征表达,但是这种方式导致了网络整体复杂性的增加,使网络更加难以优化,很容易过拟合。

CNN的网络结构和传统神经网络结构异同点有: 

  1. CNN主要有数据输入层, 卷积层, RELU激励层, 池化层, 全连接层, Batch Normalization Layer(不一定存在). 传统神经网络主要有数据输入层, 一个或多个隐层以及数据输出层. 比较可以发现CNN仍然使用传统神经网络的层级结构. 
  2. CNN的每一层都具有不同的功能, 而传统神经网络每一层都是对上一层特征进行线性回归, 再进行非线性变换的操作.
  3. CNN使用RELU作为激活函数(激励函数) , 传统神经网络使用sigmoid函数作为激活函数.
  4. CNN的池化层实现数据降维的作用,提取数据的高频信息.传统神经网络没有这个作用.

CNN主要是在图像分类物品识别等应用场景应用比较多

2.2.0 CNN的主要层次介绍

CNN保持了层级网络结构,不同层次使用不同的形式(运算)与功能

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

2.2.1 数据输入层 (Input Layer)

和神经网络/机器学习一样,需要对输入的数据需要进行预处理操作,需要进行预处理的主要原因是:

  • 输入数据单位不一样,可能会导致神经网络收敛速度慢,训练时间长
  • 数据范围大的输入在模式分类中的作用可能偏大,而数据范围小的作用就有可能偏小
  • 由于神经网络中存在的激活函数是有值域限制的,因此需要将网络训练的目标数据映射到激活函数的值域
  • S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X),f(100)与f(5)只相差0.0067

常见的数据预处理的方式有以下几种:

  1. 均值化处理 --- 即对于给定数据的每个特征减去该特征的均值(将数据集的数据中心化到0)
  2. 归一化操作 --- 在均值化的基础上再除以该特征的方差(将数据集各个维度的幅度归一化到同样的范围内)
  3. PCA降维 --- 将高维数据集投影到低维的坐标轴上, 并要求投影后的数据集具有最大的方差.(去除了特征之间的相关性,用于获取低频信息)
  4. 白化 --- 在PCA的基础上, 对转换后的数据每个特征轴上的幅度进行归一化.用于获取高频信息.
  5.  http://ufldl.stanford.edu/wiki/index.php/白化

  • 上面分别为:原图、x = x - np.mean(x, 0)、x = (x - np.mean(x, 0)) / np.std(x, 0)

  • 上图分别为:原图、PCA、白化
  • x -= np.mean(x, axis=0) #  去均值
  • cov = np.dot(x.T, x) / x.shape[0] #  计算协方差
  • u, s, v = np.linalg.svd(cov) #  进行 svd 分解
  • xrot = np.dot(x, u)
  • x = np.dot(x, u[:, :2]) #  计算 pca   
  • x = xrot / np.sqrt(s + 1e-5) #  白化

备注:虽然我们介绍了PCA去相关和白化的操作,但是实际上在卷积神经网络中,一般并不会适用PCA和白化的操作,一般去均值和归一化使用的会比较多.

建议:对数据特征进行预处理,去均值、归一化

2.2.2 卷积计算层(CONV Layer)

这一层就是卷积神经网络最重要的一层,也是“卷积神经网络”的名字由来。  

人的大脑在识别图片的过程中,会由不同的皮质层处理不同方面的数据,比如:颜色、形状、光暗等,然后将不同皮质层的处理结果进行合并映射操作,得出最终的结果值,第一部分实质上是一个局部的观察结果,第二部分才是一个整体的结果合并.

还有,对于给定的一张图片, 人眼总是习惯性的先关注那些重要的点(局部), 再到全局. 局部感知是将整个图片分为多个可以有局部重叠的小窗口, 通过滑窗的方法进行图像的局部特征的识别. 也可以说每个神经元只与上一层的部分神经元相连, 只感知局部, 而不是整幅图像.

基于人脑的图片识别过程,我们可以认为图像的空间联系也是局部的像素联系比较紧密,而较远的像素相关性比较弱,所以每个神经元没有必要对全局图像进行感知,只要对局部进行感知,而在更高层次对局部的信息进行综合操作得出全局信息;即局部感知。

  • 局部关联:每个神经元看做一个filter
  • 窗口(receptive field)滑动,filter对局部数据进行计算
  • 相关概念:深度:depth,步长:stride,填充值:zero-padding

CONV过程参考:http://cs231n.github.io/assets/conv-demo/index.html

一个数据输入,假设为一个RGB的图片

在神经网络中,输入是一个向量,但是在卷积神经网络中,输入是一个多通道图像(比如这个例子中有3个通道)

1) 局部感知

在进行计算的时候,将图片划分为一个个的区域进行计算/考虑;

那么,为什么可以使用局部感知呢?

我们发现, 越是接近的像素点之间的关联性越强, 反之则越弱. 所以我们选择先进行局部感知, 然后在更高层(FC层)将这些局部信息综合起来得到全局信息的方式.

2) 参数共享机制

所谓的参数共享就是就是同一个神经元使用一个固定的卷积核去卷积整个图像,也可以认为一个神经元只关注一个特征. 而不同的神经元关注多个不同的特征.(每一个神经元都可以看作一个filter)

固定每个神经元的连接权重,可以将神经元看成一个模板;也就是每个神经元只关注一个特性

需要计算的权重个数会大大的减少

3) 滑动窗口的重叠

滑动窗口重叠就是在进行滑窗的过程中对于相邻的窗口有局部重叠的部分,这主要是为了保证图像处理后的各个窗口之间的边缘的平滑度。降低窗口与窗口之间的边缘不平滑的特性。

4)) 卷积计算

卷积的计算就是: 对于每一个神经元的固定的卷积核矩阵与窗口矩阵的乘积(对应位置相乘)再求和之后再加上偏置项b的值, 就得到了代表该神经元所关注的特征在当前图像窗口的值.

如图2.4所示, 可以看出卷积计算的过程.动态图点击这里查看.

2.2.3 RELU激励层

这一层就是激活层, 在CNN中一般使用RELU函数作为激活函数.它的作用主要是将卷积层的输出结果做非线性映射.

1) 常见的几种激活函数

激活函数之 Sigmoid、tanh、ReLU、ReLU变形和Maxout

  1. sigmoid函数(S函数)
  2. Tanh函数(2S函数)
  3. RELU函数 ----> 线性修正单元 ---> max{ 0, x } ==>无边界, 易出现'死神经元'
  4. Leaky ReLU 函数 ---> 若x> 0 , 则输出x ; 若x<0,则 alpha*x, 其中 0< alpha <1  ==> 对RELU的改进
  5. ELU 函数 ---> 若x> 0 , 则输出x ; 若x<0,则 alpha*(e^x - 1), 其中 0< alpha <1  ==> 也是一种对RELU的改进
  6. Maxout函数 ---> 相当于增加了一个激活层

2) 激活函数的一些建议

  1. 一般不要使用sigmoid函数作为CNN的激活函数.如果用可以在FC层使用.
  2. 优先选择RELU作为激活函数,因为迭代速度快,但是有可能效果不佳
  3. 如果2失效,请用Leaky ReLU或者Maxout,此时一般情况都可以解决啦
  4. 在极少的情况下, tanh也是有不错的效果的

2.2.4 池化层 (Poling Layer)

在连续的卷积层中间存在的就是池化层,主要功能是:通过逐步减小表征的空间尺寸来减小参数量和网络中的计算;池化层在每个特征图上独立操作。使用池化层可以压缩数据和参数的量,减小过拟合。简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。

池化层中的数据压缩的策略主要有:

  1. Max Pooling(最大池化)---> 选择每个小窗口中最大值作为需要的特征像素点(省略掉不重要的特征像素点)
  2. Average Pooling(平均池化) --->  选择每个小窗口中平均值作为需要的特征像素点

    池化层选择较为重要的特征点, 可以降低维度, 能够在一定程度上防止过拟合的发生.

2.2.5 FC全连接层

类似传统神经网络中的结构,FC层中的神经元连接着之前层次的所有激活输出;换一句话来讲的话,就是两层之间所有神经元都有权重连接;通常情况下,在CNN中,FC层只会在尾部出现

通过全连接结构,将前面输出的特征重新组合成一张完整的图像.

一般的CNN结构依次为:

  • INPUT
  • [[CONV -> RELU] * N -> POOL?]*M
  • [FC -> RELU] * K
  • FC

2.2.6 Batch Normalization Layer(一般用于卷积层后面,主要是使得期望结果服从高斯分布,好像使用之后可以更快的收敛)

Batch Normalization Layer(BN Layer)是期望我们的结果是服从高斯分布的,所以对神经元的输出进行一下修正,一般放到卷积层后,池化层前。

  • 论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift;
  • 论文链接:https://arxiv.org/pdf/1502.03167v3.pdf

如果输出的是N*D的结果,对D个维度每个维度求解均值和方差。

根据均值和方差做归一化。(其实就是上面的去均值和除以方差)

强制的进行归一化操作可能存在一些问题,eg: 方差为0等

Batch Normalization优点:

  • 梯度传递(计算)更加顺畅,不容易导致神经元饱和(防止梯度消失(梯度弥散)/梯度爆炸)
  • 学习率可以设置的大一点
  • 对于初始值的依赖减少

Batch Normalization缺点:

  • 如果网络层次比较深,加BN层的话,可能会导致模型训练速度很慢。

备注:BN Layer慎用!!!

3 CNN的优缺点

优点

    ① 使用局部感知和参数共享机制(共享卷积核), 对于较大的数据集处理能力较高.对高维数据的处理没有压力

    ② 能够提取图像的深层次的信息,模型表达效果好.

    ③ 不需要手动进行特征选择, 只要训练好卷积核W和偏置项b, 即可得到特征值.

缺点

    ① 需要进行调参, 模型训练时间较长, 需要的样本较多, 一般建议使用GPU进行模型训练.

    ② 物理含义不明, 每层中的结果无法解释, 这也是神经网络的共有的缺点. 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习之卷积神经网络(Convolutional Neural Networks, CNN)(二)

前面我们说了CNN的一般层次结构, 每个层的作用及其参数的优缺点等内容.深度学习之卷积神经网络(Convolutional Neural Networks, CNN)_fenglepeng的博客-CSDN博客 一 CNN参数初始化及参数学习方法 和机器学习很多算法一样, CNN在进行训练之前也要进行参数的初始化操作. 我们…

Hadoop1.x版本升级Hadoop2.x

引言 随着企业数据化和Hadoop的应用越加广泛&#xff0c;hadoop1.x的框架设计越来越无法满足人们对需求&#xff0c;Apache一直在对Hadoop1.x进行修改&#xff0c;最后推出了新一代的Hadoop2.x。从业界使用分布式系统的变化趋势和 hadoop 框架的长远发展来看&#xff0c;MapRed…

本页由试用版打印控件lodop6.2.6输出_Visual Basic 6.0 Sirk 迷你版

Visual Basic 6.0 Sirk 迷你版 VB6 Sirk Mini 2019更新1、支持主流操作系统&#xff0c;避免原版安装失败的问题&#xff1a;支持Windows XP、Vista、Win7、Win8、Win10(32位、64位)。2、保留大部分常用功能&#xff0c;避免精简版过度精简&#xff1a;包含原版完整控件&#x…

深度学习之卷积神经网络 LeNet

卷积神经网络典型CNN LeNet&#xff1a;最早用于数字识别的CNNLeNet5&#xff1a;现在常说的一般就是LeNet5AlexNet&#xff1a;2012ILSVRC冠军&#xff0c;远超第二名的CNN&#xff0c;比LeNet更深&#xff0c;用多层小卷积叠加来替换单个的大卷积ZF Net&#xff1a;2013ILSV…

dom4j的读写xml文件,读写xml字符串

百度了一些博客&#xff0c;大同小异&#xff0c;在选取jar包工具的时候大概看了下&#xff0c;大抵是jdom原始&#xff0c;dom4j优秀。于是做了些练习。 参考&#xff1a;http://www.cnblogs.com/mengdd/archive/2013/06/05/3119927.html 1 package com.test.xml;2 3 import j…

深度学习之数据增强方案和TensorFlow操作

一、数据增强的方法介绍 增加训练数据&#xff0c; 则能够提升算法的准确率&#xff0c; 因为这样可以避免过拟合&#xff0c; 而避免了过拟合你就可以增大你的网络结构了。 当训练数据有限的时候&#xff0c; 可以通过一些变换来从已有的训练数据集中生成一些新的数据&#x…

使用OpenSSL实现CA证书的搭建过程

个人博客地址&#xff1a;http://www.pojun.tech/ 欢迎访问 什么是CA CA,Catificate Authority,通俗的理解就是一种认证机制。它的作用就是提供证书&#xff08;也就是服务端证书&#xff0c;由域名&#xff0c;公司信息&#xff0c;序列号&#xff0c;签名信息等等组成&#…

gdb使用实例

第一篇 概论我们将学习使用gdb来调试通过一个通过串行线同PC相连的嵌入式系统。Gdb可以调试各种程序&#xff0c;包括C、C、JAVA、PASCAL、FORAN和一些其它的语言。包括GNU所支持的所有微处理器的汇编语言。在gdb的所有可圈可点的特性中&#xff0c;有一点值得注意&#xff0c;…

Linux 监控命令之 netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 语法 netstat [-acC…

solr 配置

创建 SolrHome(solrCore) 1.解压 solr-4.10.4.tgz 到 /usr/local/solr 2.将 solr-4.10.4/example/solr 下所有文件拷贝到 /usr/local/solrhome (此 solrhome 为自己创建的) solrhome 是 solr 运行主目录&#xff0c;可包含多个 SolrCore 目录SolrCore 目录中包含运行 Solr 实例…

mfc程序转化为qt_10年程序员:我都学过这些语言,2019年开始我再也不是程序员......

为什么学编程2008年&#xff0c;高中毕业的我问一个已经工作两年的亲戚&#xff1a;什么专业工资高&#xff1f;他告诉我&#xff1a;程序员。2008年成都最低工资好像是800元&#xff0c;我的生活费也是800元&#xff0c;据他所说程序员出来的工资是2000&#xff0c;于是开始了…

day 7 引用

1.ba在c语言和python中的区别 c语言&#xff1a;a100 a变量里面放的100 b a b变量里面也放的100 python &#xff1a; a100 内存中有个100 a放的100的内存地址 b a b也放的100的内存地址 相当于给100那一块内存&#xff0c;贴个便利签 2.type查看数据类型&…

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...

Dapper的牛逼就不扯蛋了&#xff0c;答应群友做个入门Demo的&#xff0c;现有园友需要&#xff0c;那么公开分享一下&#xff1a; 完整Demo&#xff1a;http://pan.baidu.com/s/1i3TcEzj 注 意 事 项&#xff1a;http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人…

ride上点击用例不能显示edit信息_接口测试平台代码实现61: 多接口用例1

终于又序更上了&#xff0c;原谅最近作者几天事情不断。按照我们之前的计划&#xff0c;需要迅速开启很重要的核心多用例接口。首先&#xff0c;我们要确定&#xff0c;这个功能的大体设计。就放在在我们的页面 用例库 中&#xff1a;所以也就是我们很久之前就创建好的P_cases.…

MUI - 预加载

打开详情页回到顶部:document.body.scrollTop document.documentElement.scrollTop 0;方式一&#xff1a;preload一次仅能预加载一个页面&#xff08;除非循环&#xff09; var subWebview mui.preload({url: examples/accordion.html,id: template_sub,top: styles: {48 …

Bash : 索引数组

Bash 提供了两种类型的数组&#xff0c;分别是索引数组(indexed array)和关联数组(associative array)。本文主要介绍索引数组的基本用法。 索引数组的基本特点 Bash 提供的数组都是一维数组。任何变量都可以用作索引数组。通过 declare 关键字可以显式的声明一个索引数组。数组…

Python 第三方模块之 smtplib

1 python对SMTP的支持 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;是简单传输协议&#xff0c;它是一组用于用于由源地址到目的地址的邮件传输规则。 python中对SMTP进行了简单的封装&#xff0c;可以发送纯文本邮件、HTML邮件以及带附件的邮件。两个核心模块…

Node.js 使用jQuery取得Nodejs http服务端返回的JSON对象示例

server.js代码&#xff1a; // 内置http模块&#xff0c;提供了http服务器和客户端功能&#xff08;path模块也是内置模块&#xff0c;而mime是附加模块&#xff09; var httprequire("http");// 创建服务器,创建HTTP服务器要调用http.createServer()函数&#xff0c…

svg 动画_根据AI导出的SVG path制作SVG线条动画

点击右上方红色按钮关注“web秀”&#xff0c;让你真正秀起来前言首先祝大家2019新年快乐&#xff0c;万事大吉&#xff0c;猪事顺利&#xff0c;阖家欢乐。前面文章SVG 线条动画基础入门知识学习到了基础知识&#xff0c;现在来给大家讲讲如何制作SVG 制作复杂图形线条动画。假…

读书笔记2013第3本:《无价》

《无价》这本书是过年前买的&#xff0c;网络书店上写着“老罗推荐”&#xff0c;想着好像是在老罗哪一年的演讲里听过这本书&#xff0c;在豆瓣上评分7.9。读书是为了产生行动&#xff0c;读书时要提的4个问题&#xff0c;1&#xff09;这本书主要在谈些什么&#xff1f;2&…