精华内容
下载资源
问答
  • CNN卷积神经网络原理

    2017-08-06 19:03:02
    理解CNN卷积神经网络原理   1 前言  2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎...

    理解CNN卷积神经网络原理

               


    1 前言

        2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机器学习”更火,那就是“深度学习”。

        本博客内写过一些机器学习相关的文章,但上一篇技术文章“LDA主题模型”还是写于2014年11月份,毕竟自2015年开始创业做在线教育后,太多的杂事、琐碎事,让我一直想再写点技术性文章但每每恨时间抽不开。然由于公司在不断开机器学习、深度学习等相关的在线课程,耳濡目染中,总会顺带学习学习。

        我虽不参与讲任何课程(公司的所有在线课程都是由目前讲师团队的17位讲师讲),但依然可以用最最小白的方式 把一些初看复杂的东西抽丝剥茧的通俗写出来。这算重写技术博客的价值所在。

        在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频所写,是一篇课程笔记。本只是想把重点放在其卷积计算具体是怎么计算怎么操作的,但后面不断补充,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。



    2 人工神经网络

    2.1 神经元

        神经网络由大量的节点(或称“神经元”、“单元”)和相互连接而成。每个神经元接受输入的线性组合,进行非线性变换(亦称激活函数activation function)后输出。每两个节点之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

        举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在通过激活函数进行非线性变换后,神经元被激活然后被传递到其他神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。

        神经网络的每个神经元/单元如下

        类似wx + b的形式,其中

    • a1~an为输入向量,当然,也常用x1~xn表示输入
    • w1~wn为权重
    • b为偏置bias
    • f 为激活函数
    • t 为输出

        如果只是上面这样一说,估计以前没接触过的十有八九又必定迷糊了。事实上,在20世纪50/60年代,上述简单神经元被称之为感知机,可以把感知机理解为一个根据不同因素、以及各个因素的重要性程度而做决策的模型。

        举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有3个因素,这三个因素可以对应三个输入,分别用x1、x2、x3表示,此外,这三个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2、w3表示。一般来说,音乐节的演唱嘉宾会非常影响你去不去,唱得好的前提下 即便天气不好、没人陪同都可忍受,但如果唱得不好还不如你上台唱呢。所以,我们可以如下表示:

    • x1:是否有喜欢的演唱嘉宾。x1 = 1 你喜欢这些嘉宾,x1 = 0 你不喜欢这些嘉宾。嘉宾因素的权重w1 = 5
    • x2:天气好坏。x2 = 1 天气好,x2 = 0 天气不好。天气权重w2 = 2。
    • x3:是否有人陪你同去。x3 = 1 有人陪你同去,x2 = 0 没人陪你同去。是否有陪同的权重w3 = 3。
        这样,咱们的决策模型函数便建立起来了:f(x) = g( w1*x1 + w2*x2 + w3*x3 + b ),g表示激活函数。不同的输入会得到不一样的决策结果。

    2.2 激活函数

        常用的激活函数有sigmoid、tanhrelu等等,前两者sigmoid/tanh比较常见于全链接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。

        sigmoid的函数表达式如下

        其中z是一个线性组合,比如z可以等于:w0 + w1*x1 + w2*x2。通过代入很大的正数或很小的负数到函数中可知,g(z)结果趋近于0或1

        因此,sigmoid函数的图形表示如下:

        也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。输入非常大的正数时,输出结果会接近1,而输入非常大的负数时,则会得到接近0的结果。压缩至0到1有何用处呢?用处是这样一来变可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。

    2.3 神经网络

        将下图的这种单个神经元

        组织在一起,便形成了神经网络。下图便是一个三层神经网络结构


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

        啥叫输入层、输出层、隐藏层呢?

    • 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
    • 输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
    • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

        同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。比如下图中间隐藏层来说,隐藏层的3个神经元a1、a2、a3皆各自接受来自多个不同权重的输入,接着,a1、a2、a3又在自身各自不同权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。

        上图(注:图引自斯坦福机器学习公开课)中

    • 表示第j层第i个单元的激活函数
    • 表示从第j层映射到第j+1层的控制函数的权重矩阵 
        此外,输入层和隐藏层都存在一个偏置(bias unit),所以上图中也增加了偏置项:x0、a0。针对上图,有如下公式

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




    3 卷积神经网络之层级结构

       cs231n课程里给出了卷积神经网络各个层级结构,如下图


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

        所以

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

        中间是

    • CONV:卷积计算层,线性乘积 求和。
    • RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
    • POOL:池化层,简言之,即取区域平均或最大。

        最右边是

    • FC:全连接层
        这几个部分中,卷积计算层是CNN的核心,下文将重点阐述。



    4 CNN之卷积计算层

    4.1 什么是卷积

        首先,我们来了解下什么是卷积操作。
        对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。
        比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。


        分解下上图
    对应位置上是数字先乘后相加=
        中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8

    4.2 图像上的卷积

        在计算过程中,输入是一定区域大小(width*height)的数据,和滤波器filter(一组固定的权重)做内积后等到新的二维数据。
        对于下图中,左边是图像输入,中间部分就是滤波器filter(一组固定的权重),不同的滤波器filter会得到不同的输出数据,比如轮廓、颜色深浅。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:轮廓或颜色深浅。

        如下图所示

      

    4.3 cs231d的动态卷积图    

        cs231n课程中,给了一张动图,网址是:http://cs231n.github.io/assets/conv-demo/index.html
        如果初看此图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情。
        下述动图中,左边是输入,中间部分是两个不同的滤波器Filter w0、Filter w1,最右边则是两个不同的输出。

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

        值得一提的是:

    • 左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
    • 与此同时,数据窗口滑动,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的的权重)是固定不变的,这个权重不变即所谓的CNN中的参数共享机制。

        我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说“相乘后想加”,但到底具体是个怎么相乘后想加的过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

        首先,我们来分解下上述动图,如下图

        接着,我们细究下上图的具体计算过程。即上图中的输出结果-1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果-1,如下过程所示:

    -10 + 0*0 + 1*

    +

    0*0 + 1*0 + 0*1

    +

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


    +

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

    +

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

    +

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


    +

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

    +

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

    +

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


    +

     

    1

    =

    -1

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


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



    5 CNN之激励层与池化层

    5.1 ReLU激励

        2.2节介绍了激活函数sigmoid,但实际梯度下降中,容易饱和和终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下

        ReLU的优点是收敛快,求梯度简单。

    5.2 池化pool层

        前头说了,池化,简言之,即取区域平均或最大,如下图所示


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

    展开全文
  • CNN卷积神经网络原理详解(上)

    万次阅读 多人点赞 2019-10-18 23:59:17
    CNN卷积神经网络原理详解(上)前言卷积神经网络的生物背景我们要让计算机做什么?卷积网络第一层全连接层训练 前言 卷积网络(convolutional network),也叫作卷积神经网络(convolutional neural network,CNN),是...

    前言

    卷积网络(convolutional network),也叫作卷积神经网络(convolutional neural network,CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。卷积网络在诸多应用领域都表现优异。‘卷积神经网络’一词表明该网络使用了卷积(convolutional)这种数学运算。卷积神经网络的运作模式如下图所示:


    上图只是一个卷积神经网络的基本构成,其中卷积层和池化层可以根据实际情况任意增加。当前卷积神经网络的应用场合非常广泛,比如图像识别,自然语言处理,灾难性气候预测甚至围棋人工智能等,但是最主要的应用领域还是图像识别领域。
    那么问题来了,为什么要用卷积神经网络来做这个事情呢?

    卷积神经网络的生物背景

    在这里插入图片描述

    如上图所示,人看到的图像,经过大脑的处理,最后呈现给我们的就是这个图像本身,而电脑看到的图像,实际上是一堆像素点的集合。面对这堆像素点,电脑并不知道这是个什么东西。那么我们需要电脑做什么呢?当然是让电脑辨认出这堆像素点所代表的那个图像。怎么做呢?伟大的科学家们这里借鉴了神经生物学家对猫在观察事物时候大脑皮层的工作原理提出了神经网络的概念。

    关于这个实验,网上和参考书上有详细介绍,这里总结就是,大脑皮层不同部位对外界刺激的敏感程度、反应程度不同。这就很好的启发了神经网络的计算核心,不断的寻找特征点,最终得出输入的到底是什么图像这个问题。

    我们要让计算机做什么?

    我们以图像为例,假定当我们的计算机看到一幅图片的时候,它实际上看到的是一组像素值。根据图像的分辨率和大小,假定它看到的是32x32x3的数组,这里的3代表这是一幅RGB的彩色图像。其中每一个数字的值都是0到255不等,代表了像素值的强弱。这些数字对于我们进行图像分类时毫无意义,这是计算机唯一可用的输入。这个想法是,你给计算机这个数组的输入,它最终会输出数字,描述了图像是一个类的概率(0.85为猫,0.1为狗,0.05为鸟等)。

    现在我们知道这个问题以及输入和输出了,我们来思考如何解决这个问题。我们希望计算机做的是能够区分所有的图像,并找出使狗成为狗或使猫成为猫的独特功能。这也是下意识地在我们的脑海中继续的过程。当我们看一张狗的照片时,如果照片具有可识别的特征,例如爪子或四条腿,我们可以将其分类。以类似的方式,计算机能够通过查找诸如边缘和曲线等低级特征来执行图像分类,然后通过一系列卷积层来构建更抽象的概念。这是一个CNN的一般概述。我们来详细说明一下。

    回到具体细节。有关CNN做的更详细的概述是,您将图像传递给一系列卷积,非线性,汇聚(下采样)和完全连接的图层,并获得输出。正如我们前面所说的那样,输出可以是一个类或者一个最能描述图像的类的概率。那么问题来了,每一层计算机都做了什么呢?

    卷积网络第一层

    这一层的理论意义
    卷积网络的第一层一定是一个卷积层,在研究卷积层是干啥的之前我们首先要明确的是这一层我们的输入是上文提到的图像的像素数值组。现在回到我们的问题,卷积层是干啥的。卷积层就是从这个像素数值组中提取最基本的特征。如何提取呢?我们假定输入的图像是一个32x32x3的数组,我们用一个5x5x3(最后乘以3是为了在深度上保持和输入图像一致,否则数学上无法计算)的模板沿着图像的左上角一次移动一个格子从左上角一直移动到右下角。输入的图像数组我们称为接受域,我们使用的模板叫做滤波器(也叫卷积核)。滤波器也是由数组组成,其中每个数字称为权重。输入的数组经过这一轮卷积输出的数组大小为28x28(32-5+1),深度由卷积核的数量决定。这个过程如下图所示:

    在这里插入图片描述
    这一层的实际意义
    但是,让我们从高层次谈论这个卷积实际上在做什么。每个这些过滤器都可以被认为是功能标识符。当我说功能时,我正在谈论的是直线边缘,简单的颜色和曲线。想想所有图像的共同点,最简单的特点。假设我们的第一个过滤器是5 x 5 x 3并且将成为曲线检测器。(在本节中,为了简单起见,让我们忽略过滤器深度为3单位的事实,并且只考虑过滤器和图像的顶部深度切片)。作为曲线检测器,过滤器将具有像素结构,沿曲线形状的区域是更高的数值(请记住,我们正在讨论的这些滤波器只是数字!)。
    在这里插入图片描述

    全连接层

    这个图层基本上需要一个输入量(无论输出是在其之前的conv或ReLU还是pool层),并输出一个N维向量,其中N是程序必须从中选择的类的数量。例如,如果你想要一个数字分类程序,N将是10,因为有10个数字。这个N维向量中的每个数字表示某个类别的概率。例如,如果用于数字分类程序的结果向量是[0.1.175 0 0 0 0 0 .05],那么这代表10%的概率,即图像是1,10%的概率图像是2,图像是3的概率是75%,图像是9的概率是5%(注意:还有其他方法可以表示输出,但我只是展示了softmax方法)。完全连接图层的工作方式是查看上一层的输出(我们记得它应该代表高级特征的激活图),并确定哪些特征与特定类最相关。例如,如果程序预测某些图像是狗,则在激活图中将具有高值,例如爪子或4条腿等的高级特征。类似地,如果程序预测某图像是鸟,它将在激活地图中具有很高的价值,代表像翅膀或喙等高级特征。基本上,FC层看着什么高级特征与特定类最强关联,并具有特定的权重,以便当你计算权重与上一层之间的乘积。

    在这里插入图片描述

    训练

    在我们搭建完毕神经网络的结构之后,我们需要对这个网络进行训练。训练的过程就是给这个网络模型不断的提供任务,让模型在执行任务的过程中积累经验,最终对类似的事件可以做出正确的判断。通俗的解释就是,假设我们教导一个小孩子认识狗,我们会给他看各种各样的狗,并告诉他,这是狗时间长了之后,当小孩见到狗这个物种的时候,就自然而然的知道是狗了。当然有时候也会有例外。比如来了一只狼,也许就会被误认为也是狗(狼狗)。造成这个误差的原因也许是我们给小孩看的狗的样本还不够多(可以理解为数据量不够,欠拟合),也有可能是我们教的方式不是最好的(选用的模型不是最优的)

    现在回到我们的网络模型问题上,第一个conv层中的过滤器如何知道要查找边和曲线?完全连接的图层如何知道要查看的激活图?每层中的过滤器如何知道有什么值?计算机能够调整其过滤值(或权重)的方式是通过称为反向传播的训练过程。
    在我们进入反向传播之前,我们必须先退后一步,讨论神经网络的工作需求。现在我们都出生了,我们的思想是新鲜的(神经网络搭建好了,但是还未训练)。我们不知道什么是猫,狗或鸟。以类似的方式,在CNN开始之前,权重或筛选值是随机的。过滤器不知道寻找边缘和曲线。在更高层的过滤器不知道寻找爪子和喙。然而,随着年龄的增长,我们的父母和老师向我们展示了不同的图片和图片,并给了我们相应的标签。被赋予形象和标签的想法是CNN经历的培训过程。在深入研究之前,我们假设我们有一套训练集,其中包含成千上万的狗,猫和鸟的图像,每个图像都有一个这个图像是什么动物的标签。

    反向传播可以分为4个不同的部分,正向传递,丢失函数,反向传递和权重更新。在正向传球过程中,您将会看到一张训练图像,我们记得这是一个32 x 32 x 3的数字数组,并将其传递给整个网络。在我们的第一个训练样例中,由于所有的权值或过滤值都是随机初始化的,因此输出结果可能类似[.1.1.1.1.1.1.1.1.1.1],基本上是输出不了任何准确数字。网络以其当前的权重无法查找这些低级特征,因此无法就分类的可能性作出任何合理的结论。这转到损失功能反向传播的一部分。请记住,我们现在使用的是训练数据。这个数据有一个图像和一个标签。例如,假设输入的第一个训练图像是3,图像的标签是[0 0 0 1 0 0 0 0 0 0]。损失函数可以用许多不同的方式来定义,但常见的是MSE(均方误差)。

    假设变量L等于该值。正如你可以想象的那样,第一对训练图像的损失将非常高。现在,让我们直观地思考这个问题。我们希望达到预测的标签(ConvNet的输出)与训练标签相同的点(这意味着我们的网络得到了预测权)。为了达到这个目的,我们希望最小化损失量我们有。将这看作是微积分中的一个优化问题,我们想要找出哪些输入(权重在我们的情况下)是最直接导致网络损失(或错误)的因素。

    tips
    关于卷积神经网络的数学含义,我会在CNN卷积神经网络原理详解(下)里面详细解释。
    传送门:
    CNN卷积神经网络原理详解(中)
    CNN卷积神经网络原理详解(下)

    展开全文
  • CNN卷积神经网络原理详解(中)

    万次阅读 2019-10-19 12:43:44
    CNN卷积神经网络原理详解(中)卷积神经网络与全连接神经网络的比较卷积运算的数学解释卷积计算的工作模式 卷积神经网络与全连接神经网络的比较 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈...

    卷积神经网络与全连接神经网络的比较

    在这里插入图片描述
    卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。 它包括卷积层(convolutional layer)和池化层(pooling layer)。
    名词解释
    前馈神经网络
    前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。是目前应用最广泛、发展最迅速的人工神经网络之一。研究从20世纪60年代开始,目前理论研究和实际应用达到了很高的水平。

    卷积运算的数学解释

    为什么用卷积运算
    通常情况下,卷积是对两个实变函数的一种数学运算。首先我们从一个例子出发给我卷积的定义。
    假设我们正在用激光传感器追踪一艘宇宙飞船的位置。我们的激光传感器给出一个单独的输出x(t),表示宇宙飞船在时刻t的位置。x和t都是实值,这意味着我们可以再任意时刻从传感器读出飞船的位置。
    现在假设我们的传感器收到一定程度的噪声干扰。为了得到飞船位置的低噪声估计,我们对得到的测量结果进行平均。显然,时间上越接近的测量结果越相关,所以我们采用一种加权平均的方法,对于最近的测量结果赋予更高的时间间隔。我们可以采用一个加权函数w(a)w(a)来实现,其中aa表示测量结果距当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作,就得到了一个新的对于飞船位置的平滑估计函数ss
    s(t)=x(a)w(ta)das(t)=\int x(a)w(t-a)da{\color{Red} }{\color{Blue} {\color{DarkOrange} }}{\color{Orange} }

    简单的解释一下:
    s(t)s(t): tt时刻宇宙飞船的位置(我们要求的目标)
    x(a)x(a): 我们令t=tat'=t-a,则x(a)x(a)表示tt'时刻飞船的位置(该位置包含了噪音,因此不是精确的位置)
    w(ta)w(t-a):表示tt'时刻飞船在该位置的可能性,也可以成为比重
    最终我们将宇宙飞船从tt'时刻到tt时刻的过程中,每一个时刻测量到的位置再乘以测量时刻该位置所占比重相乘并将结果相加,最终得到一个结果,我们认为是飞船tt时刻一个较为准确的位置。

    我们把这种运算成为卷积,卷积运算通常用星号表示:
    s(t)=(xw)(t)s(t)=(x*w)(t)
    在这里插入图片描述

    在本例中,激光传感器在每个瞬时反馈测量结果明显是不切实际的。通常我们处理计算机的数据时,时间会被离散化,传感器会定期的传输数据。在本例中,假设传感器每秒反馈一次信息是比较理想的。这样,时刻tt只能取整数值。如果假设xxww都定义在时刻tt上,就可以定义离散形式的卷积:
    s(t)=(xw)(t)=a=x(a)w(ta)s(t)=(x*w)(t)=\sum_{a=-\infty}^{\infty}x(a)w(t-a)

    我们用到的卷积形式
    在机器学习的应用中,输入通常是多维数组的数据,而核通常是由学习算法优化得到的多维数组的参数。我们把这些多维数组叫做张量。由于输入与核的每一个元素都必须明确的分开存储,我们通常假设在存储了数值的有限点集以外,这些函数的值都为零。这就意味着在实际的操作过程中,我们可以通过对有限个数组元素的求和来实现无限求和。

    我们经常一次在多个维度上进行卷积运算,例如,如果把一张二维的图像II作为输入,那么为了数学模型可以计算,我们的核KK也必须是一个二维数组:
    S(i,j)=(IK)(i,j)=mnI(m,n)K(im,jn)S(i,j)=(I*K)(i,j)=\sum_{m}\sum_{n}I(m,n)K(i-m,j-n)
    简单解释一下:
    S(i,j)S(i,j):在二维数组中,我们想要得到在坐标i,ji,j处的值(参照s(t)s(t))
    I(i,jI(i,j:在二维数组中,在坐标i,ji,j处的测量值,参照x(t)x(t)
    K(m,n)K(m,n):与目标位置(i,ji,j)相距(m,nm,n)处位置的坐标代表的值所占比重,参照w(ta)w(t-a)

    在这里插入图片描述

    卷积计算的工作模式

    何为卷积?
    卷积就是在原始的输入中进行特征的提取。提取过程分区域,一块一块的提取。并且根据卷积层的递增,提取的特征也由最基本的点、线、面变成了可以分别事物的具化的特征,例如汽车的轮胎、猫的耳朵等。
    在这里插入图片描述
    上图中最左边的方块是输入,尺寸是3232的3通道图像。中间黄色方块是一个卷积核,尺寸是55,该尺寸是一个设定值,深度和输入一样都为3(这里深度必须和输入深度相同,否则数学上无法计算)。最终输出是一个特征图,尺寸为2828。
    中间灰色方块是3个卷积核,尺寸与上面黄色方块相同,但是数量是3,因此输出是3个特征图,尺寸为28
    28。
    tips:
    卷积操作不仅可以对原始输入层执行,对于经过卷积操作的层,也可以再次使用。但是核的输入一定要与上一层的深度相同。

    在这里插入图片描述
    简单解释
    第一次卷积可以提取出低层次的特征。

    第二次卷积可以提取出中层次的特征。

    第三次卷积可以提取出高层次的特征。

    特征是不断进行提取和压缩的,最终能得到比较高层次特征,简言之就是对原式特征一步又一步的浓缩,最终得到的特征更可靠。利用最后一层特征可以做各种任务:比如分类、回归等。

    在这里插入图片描述
    具体计算步骤
    输入是固定的,filter(核)是指定的,因此计算就是如何得到绿色矩阵。第一步,在输入矩阵上有一个和filter相同尺寸的滑窗,然后输入矩阵的元素在滑窗里的部分与filter矩阵对应位置相乘,具体过程见下图:
    在这里插入图片描述
    那么针对不同的卷积输入和卷积核,每次输出的尺寸是多少?我们可以参考如下公式
    输出的尺寸=(输入的尺寸-核的尺寸+2*填充尺寸)÷步长+1
    具体大家可以自己研究。
    从上面的卷积过程,我们还可以发现一个重要特征,在同一层的卷积计算,我们使用的是相同的卷积核。这是卷积的一重要特点,参数共享。参数共享可以极大的减少参数数量。

    池化
    卷积是为了提出特征值,那么搞完了卷积,我们就该整理这些特征值了。首先就是从这些特征值里面筛选更有特征的特征值。。。就是我们将要说的池化操作。没错,池化就是想要把卷积输出的数组尺寸近一步缩小。常用的池化有平均值池化、最大值池化。我们以最大值池化为例做一个简要说明,看完大家自然就明白平均值池化的意思了。
    在这里插入图片描述
    从上图可以看出,池化的结构和卷积一样,都是在输入的数组内以一个指定的大小扫描全图,但是池化不用计算,只做筛选。最大池化就是筛选出区域内最大值,平均池化就是计算区域的平均值。

    传送门:
    CNN卷积神经网络原理详解(上)
    CNN卷积神经网络原理详解(下)

    展开全文
  • CNN卷积神经网络原理详解(下)

    万次阅读 多人点赞 2019-10-20 10:56:56
    CNN卷积神经网络原理详解(下)反向传播 反向传播 前面讲解了卷积神经网络的网络基本架构。我们在实际运算的时候会发现,随着计算次数的增加,我们的输出结果与我们的预期结果会不断的逼近。这是因为网络中的权重...

    反向传播

    前面讲解了卷积神经网络的网络基本架构。我们在实际运算的时候会发现,随着计算次数的增加,我们的输出结果与我们的预期结果会不断的逼近。这是因为网络中的权重参数在不断的调整,那么参数是如何调整的?这就涉及到一个反向传播的问题。反向传播其实是神经网络的一个基础,下面我通过一个简单的示例带大家详细了解一下这个数学过程。

    前向传播过程

    了解反向传播之前,我们先来简单回顾一下前向传播的过程。也就是神经网络正常走完一个周期的过程。
    在这里插入图片描述
    如图所示,这是典型的神经网络的基本构成。其中L1层是输入层,L2层是隐藏层,L3层是输出层。假定我们现在输入一系列数组,我们希望最后的输出是我们预期的值,那么这些数组必然要经历一个参数的计算过程,下面我们通过一个具体的示例讲述一下这个变化是如何发生的。
    首先我们明确初始条件
    输入数据:x1=0.05x_{1}=0.05, x2=0.1x_{2}=0.1;
    输出数据:y1=0.01y_{1}=0.01, y2=0.99y_{2}=0.99;
    初始权重(随着计算的进行,权重会不断的更新迭代):w1=0.15,w2=0.2,w3=0.25,w4=0.3,w5=0.4,w6=0.45,w7=0.5,w8=0.55w_{1}=0.15,w_{2}=0.2,w_{3}=0.25, w_{4}=0.3,w_{5}=0.4,w_{6}=0.45,w_{7}=0.5,w_{8}=0.55;
    偏置:b1=0.35,b2=0.6b_{1}=0.35,b_{2}=0.6.
    激活函数为sigmoid函数(用激活函数是为了去线性化,具体原因我会在下次笔记中介绍)

    这个神经网络的目的就是,我们给出一组输入,最后使得输出尽可能的接近y1=0.01,y2=0.99y_{1}=0.01,y_{2}=0.99.

    现在开始前向传播
    (1)从L1层到L2层(输入层到隐藏层):
    计算神经元x1x_{1}的输入加权和:neta11=w1x1+w2x2+b11net_{a11}=w_{1}*x_{1}+w_{2}*x_{2}+b_{1}*1
    带入数据:neta11=0.150.05+0.20.1+0.351=0.3775net_{a11}=0.15*0.05+0.2*0.1+0.35*1=0.3775

    神经元a11a_{11}的输出为(对神经元执行一次sigmoid激活):
    outa11=11+eneta11=11+e0.3775=0.593269992out_{a11}=\frac{1}{1+e^{-net_{a11}}}=\frac{1}{1+e^{-0.3775}}=0.593269992
    同理可得a12a_{12}的输出为:outa12=0.596884378out_{a12}=0.596884378

    (2)从L2层到L3层(隐藏层到输出层):
    (此时的L2层相当于我们的输入层,计算过程类似上一层)
    计算输出神经元y1y_{1}的输入加权和:nety1=w5outa11+w6outa12+b21net_{y1}=w_{5}*out_{a11}+w_{6}*out_{a12}+b_{2}*1

    带入数据:nety1=0.40.593269992+0.450.596884378+0.61=1.105905967net_{y1}=0.4*0.593269992+0.45*0.596884378+0.6*1=1.105905967
    outy1=11+enety1=11+e1.105905967=0.75136507out_{y1}=\frac{1}{1+e^{-net_{y1}}}=\frac{1}{1+e^{-1.105905967}}=0.75136507
    同理可得y2y_{2}的输出为:outy2=0.772928465out_{y2}= 0.772928465

    这样前向传播的过程就结束了,我们得到的输出值为[0.75136507 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,为了得到一组接近我们需要的数据,我们需要调整参数(神经网络的权重),重新计算输出。那么如何调整参数?我们应该知道当前参数对误差的总影响,具体的方法就是要进行反向传播计算。

    反向传播过程

    在进行反向传播之前,我们最后再回顾一下我们刚刚做了什么事情。
    刚刚,我们首先定义了一组输入数值XX;
    2,我们对输入数组执行第一册计算并将结果给到了隐藏层L2,我们假定这个函数为F(x)F(x);
    3,我们对隐藏层进行了非线性处理,假定这一步操作为S(F(x))S(F(x));
    4,接着我们将L2层视为新的输入层,对他执行了一系列变化并将值给到输出层L3,假定这一步操作为G(S(F(x)))G(S(F(x)));
    5,最后我们对输出层执行了非线性变化,得到第一次计算的最终结果,这一步操作可以看做T(G(S(F(x))))T(G(S(F(x)))).
    6,根据链式法则,现在我们要做的就是给这个多嵌套的函数脱衣服。。。

    脱衣服的过程一定要遵循先穿的后脱,后穿的先脱(会不会被河蟹)。。。

    开始脱衣服 反向传播
    1,计算总误差:

    Etotal=12(targetoutput)2E_{total}=\sum \frac{1}{2}(target-output)^{2}

    因为有两个输出,所以分我们别计算y1y1y2y2的误差,然后计算两者之和:

    Ey1=12(targety1outputy1)2=12(0.010.75136507)2=0.274811083E_{y1}=\frac{1}{2}(target_{y1}-output_{y1})^{2}=\frac{1}{2}(0.01-0.75136507)^{2}=0.274811083

    Ey20.023560026E_{y2}0.023560026

    Etotal=Ey1+Ey2=0.298371109E_{total}=E_{y1}+E_{y2}=0.298371109

    输出层向隐藏层的权值更新:

    以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出:(链式法则)

    Etotalw5=Etotalouty1outy1nety1nety1w5\frac{\partial E_{total}}{\partial w_{5}}=\frac{\partial E_{total}}{\partial out_{y1}}*\frac{\partial out_{y1}}{\partial net_{y1}}*\frac{\partial net_{y1}}{\partial w_{5}}

    在这里插入图片描述
    我们来计算每一个单独的算式:

    计算Etotalouty1\frac{\partial E_{total}}{\partial out_{y1}}

    Etotal=12(targety1outy1)2+12(targety2outy2)2E_{total}=\frac{1}{2}(target_{y1}-out_{y1})^{2}+\frac{1}{2}(target_{y2}-out_{y2})^{2}

    Etotalouty1=212(targety1outy1)21(1)+0=(targety1outy1)=(0.010.75136507)=0.74136507\frac{\partial E_{total}}{\partial out_{y1}}=2*\frac{1}{2}(target_{y1}-out_{y1})^{2-1}*(-1)+0=-(target_{y1}-out_{y1})=-(0.01-0.75136507)=0.74136507

    计算outy1nety1\frac{\partial out_{y1}}{\partial net_{y1}}

    outy1=11+enety1out_{y1}=\frac{1}{1+e^{-net_{y1}}}

    outy1nety1=outy1(1outy1)\frac{\partial out_{y1}}{\partial net_{y1}}=out_{y1}(1-out_{y1})

    outy1nety1=outy1(1outy1)=0.75136507(10.75136507)=0.186815602\frac{\partial out_{y1}}{\partial net_{y1}}=out_{y1}(1-out_{y1})=0.75136507*(1-0.75136507)=0.186815602
    (这一步实际上就是对sigmoid函数求导)

    计算nety1w5\frac{\partial net_{y1}}{\partial w_{5}}
    nety1=w5outa11+w6outa12+b21net_{y1}=w_{5}*out_{a11}+w_{6}*out_{a12}+b_{2}*1
    带入数据得到nety1w5=outa11=0.593269992\frac{\partial net_{y1}}{\partial w_{5}}=out_{a11}=0.593269992

    最后根据上面公式三者相乘:
    Etotalw5=0.741365070.1868156020.593269992=0.082167041\frac{\partial E_{total}}{\partial w_{5}}=0.74136507*0.186815602*0.593269992=0.082167041
    这样我们就求出了整体误差对w5w_{5}的偏导值。

    我们再梳理一遍上面的计算公式:

    Etotalw5=(targety1outy1)outy1(1outy1)outa11\frac{\partial E_{total}}{\partial w_{5}}=-(target_{y1}-out_{y1})*out_{y1}(1-out_{y1})*out_{a11}

    现在我们来更新w5w_{5}的值:
    w5+=w5ηEtotalw5w_{5}^{+}=w_{5}-\eta *\frac{\partial E_{total}}{\partial w_{5}}
    其中:
    1,w5+w_{5}^{+}是更新权重
    2,η\eta是学习率
    同理可以更新w6w7w8w_{6},w_{7},w_{8}的值如下:
    w6=0.408666186w_{6}=0.408666186
    w7=0.511301270w_{7}=0.511301270
    w8=0.561370121w_{8}=0.561370121

    隐藏层向输入层的权值更新

    计算方法与上面一样,但是需要注意一点。从L3层到L2层计算权重w5w_{5}时,是从outy1out_{y1}nety1net_{y1}再到w5w_{5};而从L2层到L1层就算权重w1w_{1}(以w1w_{1}为例),是从outa11out_{a11}neta11net_{a11}再到w1w_{1},其中outa11out_{a11},其中outa11out_{a11}接受的是从Ey1E_{y1}Ey2E_{y2}两个方向传递的影响。

    Etotalw1=Etotalouta11outa11neta11neta11w1\frac{\partial E_{total}}{\partial w_{1}}=\frac{\partial E_{total}}{\partial out_{a11}}*\frac{\partial out_{a11}}{\partial net_{a11}}*\frac{\partial net_{a11}}{\partial w_{1}}

    其中:

    Etotalouta11=Ey1outa11+Ey2outa11\frac{\partial E_{total}}{\partial out_{a11}}=\frac{\partial E_{y1}}{\partial out_{a11}}+\frac{\partial E_{y2}}{\partial out_{a11}}

    在这里插入图片描述
    计算Ey1outa11\frac{\partial E_{y1}}{\partial out_{a11}}:

    Ey1outa11=Ey1nety1nety1outa11\frac{\partial E_{y1}}{\partial out_{a11}}=\frac{\partial E_{y1}}{\partial net_{y1}}*\frac{\partial net_{y1}}{\partial out_{a11}}

    带入相关数据:

    Ey1nety1=Ey1outy1outy1neta11=0.741365070.186815602=0.138498562\frac{\partial E_{y1}}{\partial net_{y1}}=\frac{\partial E_{y1}}{\partial out_{y1}}*\frac{\partial out_{y1}}{\partial net_{a11}}=0.74136507*0.186815602=0.138498562

    nety1=w5outa11+w6outa12+b21net_{y1}=w_{5}*out_{a11}+w_{6}*out_{a12}+b_{2}*1

    nety1outa11=w5=0.40\frac{\partial net_{y1}}{\partial out_{a11}}=w_{5}=0.40

    Ey1outa11=Ey1nety1nety1outa11=0.1384985620.40=0.055399425\frac{\partial E_{y1}}{\partial out_{a11}}=\frac{\partial E_{y1}}{\partial net_{y1}}*\frac{\partial net_{y1}}{\partial out_{a11}}=0.138498562*0.40=0.055399425

    同理计算出:

    Ey2outa11=0.019049119\frac{\partial E_{y2}}{\partial out_{a11}}=-0.019049119

    两者相加得到总值:

    Etotalouta11=Ey1outa11+Ey2outa11=0.055399425+0.019049119=0.036350306\frac{\partial E_{total}}{\partial out_{a11}}=\frac{\partial E_{y1}}{\partial out_{a11}}+\frac{\partial E_{y2}}{\partial out_{a11}}=0.055399425+-0.019049119=0.036350306

    在计算outa11neta11\frac{\partial out_{a11}}{\partial net_{a11}}:

    outa11=11+eneta11out_{a11}=\frac{1}{1+e^{-net_{a11}}}

    outa11neta11=outa11(1outa11)=0.59326999(10.59326999)=0.241300709\frac{\partial out_{a11}}{\partial net_{a11}}=out_{a11}(1-out_{a11})=0.59326999(1-0.59326999)=0.241300709

    再计算neta11w1\frac{\partial net_{a11}}{\partial w_{1}}:

    neta11=w1x1+w2x2+b11net_{a11}=w_{1}*x_{1}+w_{2}*x_{2}+b_{1}*1

    neta11w1=x1=0.05\frac{\partial net_{a11}}{\partial w_{1}}=x_{1}=0.05

    最后三者相乘

    Etotalw1=Etotalouta11outa11neta11neta11w1=0.036350306+0.241300709+0.05=0.000438568\frac{\partial E_{total}}{\partial w_{1}}=\frac{\partial E_{total}}{\partial out_{a11}}*\frac{\partial out_{a11}}{\partial net_{a11}}*\frac{\partial net_{a11}}{\partial w_{1}}=0.036350306+0.241300709+0.05=0.000438568

    更新w1w_{1}的权值如下:
    w1+=w1ηEtotalw1=0.150.50.000438568=0.149780716w_{1}^{+}=w_{1}-\eta *\frac{\partial E_{total}}{\partial w_{1}}=0.15-0.5*0.000438568=0.149780716

    同理,更新w2w3w4w_{2}w_{3}w_{4}的权值:
    w2=0.19956143w_{2}=0.19956143
    w3=0.24975114w_{3}=0.24975114
    w4=0.29950229w_{4}=0.29950229

    这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为0.015912196,0.984065734,非常接近预期输出,证明效果还是不错的。

    传送门:
    CNN卷积神经网络原理详解(上)
    CNN卷积神经网络原理详解(中)

    展开全文
  • CNN卷积神经网络原理讲解+图片识别应用(附源码)

    万次阅读 多人点赞 2018-06-26 16:35:50
    CNN卷积神经网络识别图片,一般需要的步骤有: 卷积层初步提取特征 池化层提取主要特征 全连接层将各部分特征汇总 产生分类器,进行预测识别 1、卷积层工作原理 卷积层...
  • CNN卷积神经网络原理讲解+图片识别应用(两层) https://blog.csdn.net/kun1280437633/article/details/80817129 写给初学者的深度学习教程之 MNIST 数字识别(一个CNN) ... 深入理解卷积层,全连接层的作用意义 ...
  • DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解
  • CNN卷积神经网络原理讲解+图片识别应用(附源码), CNN笔记:通俗理解卷积神经网络--理解不同输入通道和卷积核通道关系(红色部分) #coding=utf-8 from tensorflow.examples.tutorials.mnist import input_data...
  • CNN卷积神经网络原理、识别MNIST数据集(转) 详解 MNIST 数据集(转)https://blog.csdn.net/simple_the_best/article/details/75267863 +...
  • 卷积神经网络的目的是应用于图片识别,最初的成熟的CNN模型是手写数字识别,银行很早就开始应用这个系统。本文只是对原理的理解心得(纯属个人理解),不涉及任何公式推导。 现在有一张1000*1000的照片,总共有...
  • 【深度学习】5:CNN卷积神经网络原理

    万次阅读 多人点赞 2018-01-29 10:58:16
    前言:先坦白的说,深度神经网络的学习...这篇CNN卷积神经网络原理介绍,也是自己通过收集来的资料阅读、理解、操练后,有了一定的见解后才拙笔,里面的内容我会尽量详尽,不清楚明白的地方,望大家慧眼指出。 –—
  • CNN 由许多神经网络层组成。卷积和池化这两种不同类型的层通常是交替的。网络中每个滤波器的深度从左到右增加。最后通常由一个或多个全连接的层组成: Convnets 背后有三个关键动机:局部感受野、共享权重和池化...
  • 目录 2.0 卷积神经网络简述 2.1 二维卷积层 2.1.1. 二维互相关运算 2.1.2. 图像中物体边缘检测 ...2.0 卷积神经网络简述 ...本章将介绍卷积神经网络。...我们将先描述卷积神经网络中卷积层和池化层的工作原理...
  •  在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频所写,是一篇课程笔记。本...
  • 偶然在知乎上翻到了我旭神对CNN原理的通俗易懂的解释,看完以后简直醍醐灌顶呢。 下面上头像!! 哼,赶紧记录一下加强一下理解! 转自知乎我旭神 如果学过数字图像处理,对于卷积核的作用应该不陌生,比如...
  • CNN卷积神经网络是近几年在深度学习领域中比较火的一种神经网络,具有表征学习能力,所以大家也称为“平移不变人工神经网络”。 先分享点干货,看完这些资料,你必看懂卷积神经网络: Youtube 上最好的神经网络入门...
  • CNN卷积神经网络原理简介+代码详解

    万次阅读 2017-08-22 09:00:59
    一、CNN卷积神经网络原理简介 要讲明白卷积神经网络,估计得长篇大论,网上有很多博文已经写得很好了,所以本文就不重复了,如果你了解CNN,那可以往下看,本文主要是详细地解读CNN的实现代码。如果你没学习过...
  • 从前面介绍的卷积运算的基本原理和概念,从本质上来说卷积神经网络就是将图像处理的二维离散卷积运算和神经网络相结合。这种卷积运算可以用于自动提取特征,而卷积神经网络也主要应用于二维图像的识别。
  • 卷积网络(convolutional network)(LeCun,1989),也叫作卷积神经网络(convolutional neural network,CNN),是一种专门用来处理具有类似网络结构的数据的神经网络。 它是从信号处理衍生过来的一种对数字信号...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,415
精华内容 566
关键字:

cnn卷积神经网络原理