一、神经网络为什么比传统的分类器好

1.传统的分类器有 LR(逻辑斯特回归) 或者 linear SVM ,多用来做线性分割,假如所有的样本可以看做一个个点,如下图,有蓝色的点和绿色的点,传统的分类器就是要找到一条直线把这两类样本点分开。

对于非线性可分的样本,可以加一些kernel核函数或者特征的映射使其成为一个曲线或者一个曲面将样本分开。但为什么效果不好,主要原因是你很难保证样本点的分布会如图所示那么规则,我们无法控制其分布,当绿色的点中混杂几个蓝色的点,就很难分开了,及时用曲线可以分开,这个曲线也会变得非常的扭曲,不仅难以学到,还会出现过拟合的问题。而且作为分开着两类样本的特征的抽取也是一个问题。这也是现在不用的原因。

2.那神经网络是怎么做到的呢?

神经网络其实就是使用AND和OR操作把样本点中得那一块抠出来。正如下图,最上面的绿色区域的每一个变都可以看成一个线性分类器,把样本分成正例和负例,那这些分类器做AND操作,得出的结果就是一个绿色的区域,然后把多个绿色的区域再用OR操作。而一个神经元就可以实现AND操作或者OR操作,我们只需要提供样本,神经网络就可以自己学到。这也就是它的优点所在。总结起来就是:对线性分类器的『与』和『或』的组合,完美对平面样本点分布进行分类

二、什么是卷积神经网络

卷积神经网络依旧是层级网络, 但层的功能和形式做了变化。层级结构可参照下图

 1.层级结构

其层级结构包括:数据输入层/  Input layer,卷积计算层 / CONV layer, ReLU 激励层 / ReLU layer,池化层 / Pooling layer,全连接层 / FC layer

(1)数据输入层/  Input layer

有3种常见的图像数据处理方式

去均值:把输入数据各个维度都中心化到0,也就是算出所有样本的平均值,再让所有样本减去这个均值

归一化:幅度归一化到同样的范围,比如把样本数据压缩到0-1

PCA/白化:用PCA降维,白化是对数据每个特征轴上的幅度归一化

CNN在图像上的处理往往只有去均值。

(2)卷积计算层/  CONV layer

它不再是全连接了,而是局部关联。每个神经元看做一个filter。通过对窗口(receptive field)做滑动操作,filter对局部数据计算

这里还有3个概念:

深度/depth,在这幅图中指的3,通常为图片的rgb3个颜色通道。

步长/stride:即窗口每次滑动多远

填充值/zero-padding:为了使滑动窗口正好滑动到边界,需要在周围填充0,padding等于几,就填充几圈

下面给一个卷积的具体例子:

这个例子的depth为2,因为只有两个filter,每个颜色通道的上都有一个3*3的滑动窗口,这个窗口里的值与filter里的w对应相乘,每个通道上都会得到一个值,把这3个值加起来就得出了Output Volume层值,Filter w0对输入输入卷积后得到output volume层的第一个矩阵,filter w2得到第二个。

另外,卷积层有一个特别重要的特点就是参数共享机制,即每个神经元连接数据窗的权重是固定的,可以这样理解参数共享机制:

固定每个神经元连接权重,可以看做模板,每个神经元只关注一个特性。

它带来的好处就是需要估算的权重个数减少,例如AlexNet网络从1亿个需要调节的参数减少到3.5w个。

(3)激励层 (ReLU)

把卷积层输出结果做非线性映射

常见的激励函数有:Sigmoid,Tanh(双曲正切),ReLU,Leaky ReLU,ELU,Maxout

Sigmoid:最开始使用的,现在已经基本不用了,因为当x比较大时,它的输出值都比较接近于1,它的梯度是接近于0,而我们是要要利用梯度取做优化的,这将导致无法完成权重的优化

ReLU:比价常用的激励函数,它有收敛快,求梯度简单,较脆弱这些特点,较脆弱的原因是,当x的值小于0后,它任然会出现梯度为0 的结果。

Leaky ReLU

           

不会“饱和”/挂掉,计算也很快

指数线性单元ELU:所有ReLU有的优点都有,不会挂,输出均值趋于0,因为指数存在,计算量略大

Maxout:计算是线性的,不会饱和不会挂,多了好些参数,两条直线拼接

实际经验:

1)不要用sigmoid

2)首先试RELU,因为快,但要小心点

3)如果2失效,请用Leaky ReLU或者Maxout

4)某些情况下tanh倒是有不错的结果,但是很少

(4)池化层 / Pooling layer

它的位置一般是夹在连续的卷积层中间,作用是压缩数据和参数的量,减小过拟合

(5)全连接层 / FC layer

两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。业界人解释放一个FC layer的主要目的是最大可能的利用现在经过窗口滑动和池化后保留下的少量的信息还原原来的输入信息

(6)CNN的一般结构可归结为:

1)INPUT  2) [[CONV -> RELU]*N -> POOL?]*M    3) [FC -> RELU]*K 或FC

2.典型的CNN

LeNet,这是最早用于数字识别的CNN;AlexNet,2012 ILSVRC比赛远超第2名的CNN,比LeNet更深,用多层小卷积层叠加替换单大卷积层;ZF Net,2013 ILSVRC比赛冠军;GoogLeNet,2014 ILSVRC比赛冠军;VGGNet,2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好

 3.fine-tuning

(1)何谓 fine-tuning:使用已用于其他目标,预训练好模型的权重或者部分权重,作为初始值开始训练

(2)为什么要fine-tuning:首先自己从头训练卷积神经网络容易出现问题,其次fine-tuning能很快收敛到一个较理想的状态

(3)怎么做:一般复用相同层的权重,新定义层取随机权重初始值,但要注意调大新定义层的的学习率,调小复用层学习率

三、CNN的常用框架

1.Caffe:源于Berkeley的主流CV工具包,支持C++,python,matlab,Model Zoo中有大量预训练好的模型供使用

2.TensorFlow:Google的深度学习框架,TensorBoard可视化很方便,数据和模型并行化好,速度快

3.Torch:Facebook用的卷积神经网络工具包,通过时域卷积的本地接口,使用非常直观,定义新网络层简单.

四、典型应用

1.图像识别与检索

2.人脸识别

3.性别/年龄/情绪识别

4.物体检测

五、CNN训练注意事项

1.用Mini-batch SGD对神经网络做训练的过程如下:

不断循环 :

①  采样一个 batch 数据( ( 比如 32 张 )

②前向计算得到损失 loss

③  反向传播计算梯度( 一个 batch)

④  用这部分梯度迭代更新权重参数

2.去均值

去均值一般有两种方式:第一种是在每个像素点都算出3个颜色通道上的平均值,然后对应减去,如AlexNet。 第二种是在整个样本上就只得到一组数,不分像素点了,如VGGNet。

3.权重初始化

1)用均值为0的高斯函数,随机取一些点去初始化W。这种初始化方法对于层次不深的神经网络 OK,深层网络容易带来整个网络( 激活传递)的不对称性

2)当激励函数是sigmoid函数时,输入层神经元个数为input,输出层为output,则输出层的W可为input和output之间的一个数/input的平方根,公式如下

            

3)当激励函数变成当今最为流行ReL函数时,以上方式又失效了,除以(input/2)的平方根是可以的

关于Batch Normalization:通常在全连接层后 , 激励层前做如下操作

它的作用是自动的约束输出不会发散,导致导致整个网络的训练死掉,具体的官方的好处有如下四点:

1)梯度传递(计算 )更为顺畅

2)学习率设高一点也没关系

3)对于初始值的依赖减少了!!

4)其实这里也可以看做一种正则化 , 减少了对dropout的需求。

4.Dropout

这是一种防止过拟合的一种正则化方式,以前的正则化方式是在loss中加上所有的W,但在神经网络中不可行,因为w的数量太大了,不仅会使loss值很大,也会浪费很多时间在计算w的和上。简单的理解dropout就是别一次开启所有学习单元

一个最简单的实现方式可参照如下代码所示:

dropout一般在训练阶段使用,在测试或者预测时并不会去dropout,工业上的做法是在输入的X上乘以P得到X的期望,或者输入不做变化而是对所有的有dropout层都做X/p

dropout能防止过拟合的的理解方式:

理解一:别让你的神经网络记住那么多东西

理解二:每次都关掉一部分感知器 , 得到一个新模型 , 最后做融合

六.CAFFE的介绍与使用

1.Caffe主要的类/模块

                                    

2.Caffe使用方法

讲道理:使用caffe根本不用写程序,只用命令行就可以了,步骤如下;

① Resize 图片 , 转换存储格式

② 定义网络结构(编辑 prototxt)

③ 定义 solver (编辑另一个 prototxt

④ 训练(可以基于已有的权重赋值 , 跑一个脚本 )

第1步:转化格式

第2步:定义层次结构

第3步:定义solver

第4步:训练

关于fine-tuning

如果层次不变 , 只需修改输入输出

如果层次改变 , 添加/ / 删减层次

     ——》         ——》——》

fine-tuning技巧/注意点

1)优先学习权放在新加层:每一层都有控制学习率的参数: blobs_lr,一般会把前面层学习率调低,最后新加层调高,你甚至可以freeze前面的层次不动,一般fine-tuning的前期loss下降非常快,中间有个瓶颈期,要有耐心

2)在solver处调整学习率:调低solver处的学习率(1/10, 1/100),记住存储一下中间结果,以免出现意外

卷积神经网络CNN与深度学习常用框架的介绍与使用的更多相关文章

  1. 包含深度学习常用框架的Docker环境

    相关的代码都在Github上,请参见我的Github,https://github.com/lijingpeng/deep-learning-notes 敬请多多关注哈~~~ All in one d ...

  2. 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  3. 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...

  4. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  5. 深度学习之卷积神经网络CNN

    转自:https://blog.csdn.net/cxmscb/article/details/71023576 一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连 ...

  6. 深度学习之卷积神经网络CNN及tensorflow代码实例

    深度学习之卷积神经网络CNN及tensorflow代码实例 什么是卷积? 卷积的定义 从数学上讲,卷积就是一种运算,是我们学习高等数学之后,新接触的一种运算,因为涉及到积分.级数,所以看起来觉得很复杂 ...

  7. 深度学习之卷积神经网络CNN及tensorflow代码实现示例

    深度学习之卷积神经网络CNN及tensorflow代码实现示例 2017年05月01日 13:28:21 cxmscb 阅读数 151413更多 分类专栏: 机器学习 深度学习 机器学习   版权声明 ...

  8. 深度学习之卷积神经网络(CNN)详解与代码实现(二)

    用Tensorflow实现卷积神经网络(CNN) 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10737065. ...

  9. 卷积神经网络CNN学习笔记

    CNN的基本结构包括两层: 特征提取层:每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征.一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来: 特征映射层:网络的每个计算层由多 ...

随机推荐

  1. IIS7中配置FastCGI运行PHP

    环境说明: 操作系统:使用windows 2008 server 64位系统,IIS7.5PHP版本:官方下载PHP 5.4.16 VC9 x86 Non Thread SafeZIP版本.PHP路径 ...

  2. background总结

    1. background-position background-position的百分比属性规则是:图片本身(x%,y%)的那个点,与背景区域的(x%,y%)的那个点重合. 具体可参考: http ...

  3. CSS3 图片悬浮缩放效果

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  4. C#传递参数大集合

    方法的参数是个值得特别注意的地方.方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array).传值参数无需额外的 ...

  5. Lua 数据库访问(转)

    本文主要为大家介绍 Lua 数据库的操作库:LuaSQL.他是开源的,支持的数据库有:ODBC, ADO, Oracle, MySQL, SQLite 和 PostgreSQL. 本文为大家介绍MyS ...

  6. 【Python的迭代器,生成器】

    一.可迭代对象和迭代器 1.迭代的概念 上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值 注:循环不是迭代 while True: ...

  7. [编织消息框架][netty源码分析]5 eventLoop 实现类NioEventLoopGroup职责与实现

    分析NioEventLoopGroup最主有两个疑问 1.next work如何分配NioEventLoop 2.boss group 与child group 是如何协作运行的 从EventLoop ...

  8. Laravel 源码解读系列第四篇-Auth 机制

    前言 Laravel有一个神器: php artisan make:auth 能够快速的帮我们完成一套注册和登录的认证机制,但是这套机制具体的是怎么跑起来的呢?我们不妨来一起看看他的源码.不过在这篇文 ...

  9. 20175214 《Java程序设计》第9周学习总结

    20175214 <Java程序设计>第9周学习总结 本周学习任务总结 1.根据<java2实用教程>和蓝墨云学习视频学习第十一章: 2.尝试将课本重点内容用自己的话复述手打: ...

  10. 【转载】Linux常用命令

    Linux常用命令大全(非常全!!!) 转载出处:https://www.cnblogs.com/yjd_hycf_space/p/7730690.html 系统信息 arch 显示机器的处理器架构( ...