美文网首页AI
机器学习之CNN

机器学习之CNN

作者: 欢喜明 | 来源:发表于2018-04-02 18:04 被阅读0次

    目录

    一、模式识别、机器学习、深度学习简介

    二、相关名词解释

    三、介绍CNN(卷积神经网络)

    四、矩阵运算

    五、参考文章

    一、模式识别、机器学习、深度学习简介

       模式识别(Pattern recognition)、机器学习(machine learning)和深度学习(deep learning)代表三种不同的思想流派。

       模式识别是最古老的(作为一个术语而言,可以说是很过时的)。

       机器学习是最基础的(当下初创公司和研究实验室的热点领域之一)。深度学习是非常崭新和有影响力的前沿领域。

    1、模式识别

       智能程序的诞生。70年代至80年代提出。强调的是如何让一个计算机程序去做一些看起来很“智能”的事情。例如区分“3”和“B”或者“3”和“8”,需要专门手工设计一些分类规则,如滤波,边缘检测和形态学处理等技术。设计到图形处理的专业知识。

    2、机器学习

       从样本中学习的智能程序。是数据驱动的。90年代初提出。强调的是给计算机程序(或者机器)输入一些数据后,它学习这些数据,而这个学习的步骤是明确的,学习结果是对已有数据的分类和一个预测模型,预测模型可用于对未知数据的预测。

    3、深度学习

       新世纪的热门方向。强调的是使用的模型(例如卷积神经网络)。模型中的参数可以从数据中学习获得。在深度学习的模型中,很流行的就是被用在大规模图像识别中的卷积神经网络(Convolutional Neural Nets,CNN),简称ConvNets。深度学习需要非常大的计算能力,大多在GPU进行计算。学习深度学习,需要一些线性代数的知识。

    4、总结

       先看图:

    Deep learning,机器学习里面现在比较火的一个topic,本身是神经网络算法的衍生。在图像,语音等富媒体的分类和识别上取得了非常好的效果。深度学习只是机器学习的一个子类,是机器学习一类比较火的算法,本质上还是原来的神经网络。就是用复杂、庞大的神经网络进行机器学习。

    二、相关名词解释

    1、二值化:

       图像的二值化,就是将图像上的像素点的灰度值设置为0或255(白色为255,黑色为0),也就是将整个图像呈现出明显的只有黑和白的视觉效果。作用就是:保留想要的像素点,去掉干扰像素点。(注意,二值化不是把彩色图像变成黑白图像)。

    如图:

    2、灰度值:

       景物各点的颜色及亮度不同,摄成的黑白照片上各点呈现不同程度的灰色。把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像,在医学、图像识别领域有很广泛的用途。

    3、标量(scalar):

       亦称“无向量”。有些物理量,只具有数值大小,而没有方向,部分有正负之分。物理学中,标量(或作纯量)指在坐标变换下保持不变的物理量。用通俗的说法,标量是只有大小,没有方向的量。

    4、向量:

       在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有大小(magnitude)和方向的量。

    5、线性组合:

       线性组合是一个线性代数中的概念,代表一些抽象的向量各自乘上一个标量后再相加。(得到的这个值就是向量们的一个线性组合)。

       设S为一向量空间V的非空子集

    如果存在有限多个向量(v1、v2、...、vk)属于S,和属于F的对应标量(a1、a2、...、ak),使得v = a1v1+a2v2+...+akvk,则称v是S的一个线性组合。

       我们亦称v是v1、v2、...、vk的一个线性组合,且a1、a2、...、ak是该线性组合的系数

    6、线性函数

    线性函数也常用作一次函数的别称。

    线性是指:一次函数,就是说得一元一次方程,用坐标显示是直线.所以叫直线方程.

    而除了一次函数外其他的都叫非线性的.比如二次函数[抛物线],幂函数,指数函数等.

    三、介绍CNN(卷积神经网络)

       在深度学习中,有一个很重要的概念,就是卷积神经网络(CNN),是入门深度学习需要搞懂的东西。

    1、人工神经网络

    1.1神经元

       神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。

       每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

    神经网络的每个神经元:

    即是 z = wx + b的形式,其中:

    x1 、x2 表示输入向量;

    w1、w2权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重;

    b为偏置量bias;

    g(z) 为激活函数;

    a 为输出;

       举个例子,这周末北京有一草莓音乐节,那去不去呢?

       决定你是否去有两个因素(演唱嘉宾和是否有人陪),这两个因素可以对应两个输入,分别用x1、x2表示。

       此外,这两个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。

       一般来说,音乐节的演唱嘉宾会非常影响你去不去,所以,我们可以如下表示:

    x1:是否有喜欢的演唱嘉宾。

    x1 = 1 你喜欢这些嘉宾,x1 = 0 你不喜欢这些嘉宾。

    嘉宾因素的权重 w1 = 7.

    x2:是否有人陪你去。

    x2 = 1 有人陪你去,x2 = 0 没人陪你去。

    是否有人陪同的权重w1 = 3.

    这样,咱们的决策模型便建立起来了:

    g(z) = g(w1*x1 + w2*x2 +b)

    g表示激活函数;是选定的一个特定的函数;z作为g的输入;

       这里的b可以理解成:为更好达到目标而做调整的偏置项。

       一开始为了简单,把激活函数定义成一个线性函数,即对于结果做一个线性变化。比如一个简单的线性激活函数是g(z) = z,输出都是输入的线性变换。后来实际应用中发现,线性激活函数太过局限,很多数据不是线性可分的,于是引入了非线性激活函数。

    1.2激活函数

       常用的非线性激活函数有sigmoid、tanh、relu等,前两者sigmoid、tanh比较常见于全链接层,后者relu常见于卷积层。

       sigmoid的函数表达式如下:

    其中z是一个线性组合,如 z = w1*x1 + w2*x2 +b.

    sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):

    可以看到通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1。

    也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常大的负数时,则g(z)会趋近于0。

       压缩至0到1有的作用是:可以把激活函数看作一种“分类的概率”,如激活函数的输出为0.9,便可以解释为90%的概率为正样本。

       如下图:

    z = w1*x1 + w2*x2 +b.

    其中b为偏置项,假定取:-30,w1 , w2 都取为20.

    如果 x1 = 0,x2 = 0,则z = -30,g(z) =1/( 1 + e^-z ) 趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z = -30的时候,g(z)的值趋近于0。

    如果 x1 = 0,x2 = 1,或者  x1 = 1,x2 = 0 则z = -10,,同样,g(z)的值趋近于0。

    如果 x1 = 1,x2 = 1,则z = 10,此时,g(z)趋近于1。

    即是只有 x1 和 x2 都取1的时候,g(z)→1,判定为正样本;x1或者x2取0的时候,g(z)→0,判定为负样本,如此达到分类的目的。

    1.3 神经网络

       将下图的这种单个神经元组织在一起,便形成了神经网络。

    下图是一个三层神经网络结构:

    上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。

       输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。

       输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。

       隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

       每一层都可由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。

       如下图中间的隐藏层,隐藏层的3个神经元a1、a2、a3各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2

    a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下成为输出层的输入,最终由输出层输出最终结果。

    上图中的是一层隐藏层,但实际中也有多层隐藏层,即输入层和输出层中间夹着数层隐藏层,层和层之间是全连接的结构,同一层的神经元之间没有连接。如下图:

    2、卷积神经网络的层级结构

       卷积神经网络(CNN)由输入层、卷积层、激活函数、池化层、全连接层组成,即INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)。

    cs231n课程(http://cs231n.github.io/convolutional-networks/#overview)里给出了卷积神经网络各个层级结构,如下图:

    上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:是车还是马,如果是车,那是什么车。

       最左边是数据输入层(图片-车),对数据做一些处理,如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)等。CNN只对训练集做“去均值”。

       中间部分是:

       CONV:卷积计算层,线性乘积求和。

       RELU:激活层,ReLU是激活函数的一种。

       POOL:池化层,即取区域平均或最大(实际应用中发现取最大效果更好)。

       最右边是FC:全连接层。连接所有的特征,将输出值送给分类器(如softmax分类器)进行分类,给出分类结果。

        这几个部分中,卷积计算层是CNN的核心,下文将重点讲解。

    3、CNN卷积计算层

    3.1什么是卷积

       首先,我们来了解下什么是卷积操作。

      对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

       非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。

    卷积层是用来进行特征提取,如下图所示:

    输入图像是32*32*3,3是它的深度(即R、G、B)。

       卷积层是一个5*5*3的filter(感受野、滤波器),这里注意:感受野的深度必须和输入图像的深度相同。

       通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,上图是用了两个filter得到了两个特征图;即是使用了多少个filter,就会得到多少个特征图。

       输入图像是32*32*3,filter是5*5*3,如何得到28*28*1的特征图呢?先初步介绍一下:

       卷积的计算过程是:filter在图像上从左到右、从上到下滑动(上图的滑动步长为1,即是一个像素)做內积。这里先解释32*32*3如何变成28*28*1的。

       (1)32 ---- >28的问题:

       图像长是32,filter长是5,从左滑动到右(这里没有在图像加0的情况,这个情况下面会说),每滑动一次,计算一个结果,所以最后的到的图像长是:32 -

    5 + 1 = 28。从上滑动到下,同理。

       (2)3 ----> 1 的问题:

       这个问题简单,跟卷积的计算有关,规定:图像深度是多少,filter的深度就是多少。卷积的计算是:图像的各层次与filter的各层次分别计算后得到的结果再相加,最终才得到特征图上的值。可以知道,不管图像的深度是多少,如果只有一个filter,卷积计算得到的特征图,深度都是1。所以,特征图的深度,与原图像的深度无关,只与filter的个数有关。

       接下来,看复杂一点点,通常会使用多层卷积层来得到更深层次的特征图。如下:

    现在,应该可以看明白上图的变化了:

       32 - 5 + 1 = 28;6个filter;——> 28*28*6;

       28 - 5 + 1 = 24;10个filter;——> 24*24*10;

    再来看下卷积的计算。下图中,中左边部分是原始输入数据,中间部分是滤波器filter,图中右边是输出的新的二维数据特征图。

    滤波器与数据窗口做内积(对应位置数字相乘再相加),其具体计算过程则是:

    4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0+ 0*1 + -4*2 = -8

    3.2图像上的卷积

       如下图的计算过,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。

       具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

       看一些例子:

       图像锐化滤波器SharpnessFilter:

    把核加大,就可以得到更加精细的锐化效果:

    边缘检测Edge Detection:

    浮雕Embossing Filter:

    只要加大滤波器,就可以得到更加夸张的效果了:

    3.3 完整的卷积计算

       在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。

       这个过程中,有几个参数:

       (1)深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。

    (2)步长stride:决定滑动多少步可以到边缘。

       (3)填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑到末尾位置。通俗地讲就是为了总长能被步长整除。zero

    pad项,即为图像加上一个边界,边界元素均为0。(对原输入无影响)一般有:

    F=3=> zero pad with 1

    F=5 => zero pad with 2

    F=7 => zero pad with 3

       边界宽度是一个经验值,加上zero pad这一项是为了使输入图像和卷积后的特征图具有相同的维度,如:

           输入为5*5*3,filter为3*3*3,在zero pad 为1,则加上zero pad后的输入图像为7*7*3,则卷积后的特征图大小为5*5*1(7-3+1),与输入图像一样(步长为1);

    更一般地,(步长不为1)的特征图大小计算如下:

    卷积层还有一个特性就是“权值共享”原则。所谓的权值共享就是说,给一张输入图片,用一个filter去扫这张图,filter里面的数叫权重,这张图每个位置就是被同样的filter扫的,所以权重是一样的,也就是共享。

    看下面卷积计算的一个图,可以看到:

    两个神经元,即depth=2,意味着有两个滤波器。

    数据窗口每次移动两个步长,取3*3的局部数据,即stride=2。

    zero-padding = 1。

    然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

    ps:filter w1 也是同理的计算过程。

       左边是输入(7*7*3中,7*7代表图像的像素、长宽,3代表R、G、B 三个颜色通道);

       中间部分是两个不同的滤波器Filter w0、Filter w1;

       最右边则是两个不同的输出(有两个filter,就有两个输出);

       随着左边数据窗口的平移滑动,滤波器Filter w0 和Filter w1对不同的局部数据进行卷积计算。

       左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。

    数据窗口滑动,导致输入在变化,但中间滤波器Filter的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

       例如人看周围的世界,所看到的信息在变,但采集信息的双眼不变。但,不同人的双眼看同一个局部地方所感受到的信息不同,所以不同的滤波器就像不同的双眼,会得到不同结果。

    接下来,我们细究每一步的具体计算过程。

    上图中的第一步,输出结果1,具体是怎么计算得到的呢?

    数据窗口1:

    filter w0(1):

    计算如下:

    1*0 + 1*0 + (-1)*0

    +

    -1*0 + 0*0 + 1*1

    +

    -1*0 +-1*0 + 0*1

    +

    数据窗口2:


    filter w0(2):

    -1*0 + 0*0 + -1*0

    +

    0*0 + 0*1 + -1*1

    +

    1*0 + -1*0 + 0*2

    +

    数据窗口3:


    filter w0(3):

    0*0 + 1*0 + 0*0

    +

    1*0 + 0*2 + 1*0

    +

    0*0 + -1*0 +1*0

    +

    偏置量:1    

    =   1

    然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果。


    最后,换另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

    OK,卷积计算就是这么的简单。

    4. 池化(pool)层

           池化,简言之,即取区域平均或最大。它的功能是逐步减少图像的大小来减少网络中的参数和计算量。就是对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。

       平均池在历史上被使用,但在实际中证实,最大池,效果更好。所以现在池化都去最大值。

    如图:

    上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。

    四、矩阵运算

    1、矩阵加、减法

    设矩阵

    简言之,两个矩阵相加减,即它们相同位置的元素相加减!注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的.

    2、矩阵乘法

    2.1 矩阵与数的乘法:

    五、参考文章

    参考:

    http://cs231n.github.io/convolutional-networks/#overview

    http://blog.csdn.net/yjl9122/article/details/70198357

    http://www.csdn.net/article/2015-03-24/2824301

    http://blog.csdn.net/loving_forever_/article/details/52389862

    http://www2.edu-edu.com.cn/lesson_crs78/self/j_0022/soft/ch0605.html

    http://www2.edu-edu.com.cn/lesson_crs78/self/j_0022/soft/ch0605.html

    https://www.zhihu.com/question/22334626/answer/21036590

    http://blog.csdn.net/loving_forever_/article/details/52389862

    http://blog.csdn.net/real_myth/article/details/51824193

    https://www.zhihu.com/question/22334626

    完毕。

    相关文章

      网友评论

        本文标题:机器学习之CNN

        本文链接:https://www.haomeiwen.com/subject/ncpxhftx.html