精华内容
下载资源
问答
  • 滤波器跟卷积神经网络有什么关系呢。不如我们预想一个识别问题:我们要识别图像中的某种特定 曲线,也就是说,这个滤波器要对这种曲线有很高的输出,对其他形状则输出很低,这也就像是神 经元的 激活 。 我们设计的...

    从最基础的开始

    对二维数字信号(图像)的操作,可以写成矩阵形式。


    比如对图像做平滑,一个典型的8领域平滑,其结果中的每个值都来源于原对应位置和其周边8个元素与一个3X3矩阵的乘积:


    也就相当于对原矩阵,按照顺序将各区域元素与W矩阵相乘,W 矩阵为


    这也被称作核(Kernel, 3X3)

    其处理效果如下:


    也就是,这个核对图像进行操作,相当于对图像进行了低通滤波。因此这个核也被称为滤波器,整个操作过程按照概念称为卷积

    扩展来讲,对二维图像的滤波操作可以写成卷积,比如常见的高斯滤波、拉普拉斯滤波(算子)等。


    滤波器跟卷积神经网络有什么关系呢。不如我们预想一个识别问题:我们要识别图像中的某种特定曲线,也就是说,这个滤波器要对这种曲线有很高的输出,对其他形状则输出很低,这也就像是神

    经元的激活

    我们设计的滤波器和想要识别的曲线如下:

    假设上面的核(滤波器)按照卷积顺序沿着下图移动:




    那么当它移动到上面的位置时,按照矩阵操作,将这个区域的图像像素值与滤波器相乘,我们得到一个很大的值(6600):


    而当这个滤波器移动到其他区域时,我们得到一个相对很小的值:


    如此,我们对整个原图进行一次卷积,得到的结果中,在那个特定曲线和周边区域,值就很高,在其他区域,值相对低。这就是一张激活图。对应的高值区域就是我们所要检测曲线的位置。

    在训练卷积审计网络(CNN)的某一个卷积层时,我们实际上是在训练一系列的滤波器(filter)。比如,对于一个32x32x3(宽32像素x高32像素xRGB三通道)的图像,如果我们在CNN的第一个卷积层定义训练12个滤波器,那就这一层的输出便是32X32X12.按照不同的任务,我们可以对这个输出做进一步的处理,这包括激活函数,池化,全连接等


    简单来说,训练CNN在相当意义上是在训练每一个卷积层的滤波器。让这些滤波器组对特定的模式有高的激活,以达到CNN网络的分类/检测等目的。


    <Fig. 一个实际CNN(AlexNet)第一个卷积层的滤波器>

    卷积神经网络的第一个卷积层的滤波器用来检测低阶特征,比如边、角、曲线等。随着卷积层的增加,对应滤波器检测的特征就更加复杂(理性情况下,也是我们想要的情况)。比如第二个卷积层的输入实际上是第一层的输出(滤波器激活图),这一层的滤波器便是用来检测低价特征的组合等情况(半圆、四边形等),如此累积,以检测越来越复杂的特征。实际上,我们的人类大脑的视觉信息处理也遵循这样的低阶特征到高阶特征的模式Owl of Minerva:为什么无彩色系(黑白灰色)在色彩搭配中可以和谐地与任何彩色搭配?。最后一层的滤波器按照训练CNN目的的不同,可能是在检测到人脸、手写字体等时候激活[1]。

    所以,在相当程度上,构建卷积神经网络的任务就在于构建这些滤波器。也就是,将这些滤波器变成这样(改变滤波器矩阵的值,也就是Weight)的——能识别特定的特征。这个过程叫做训练

    在训练开始之时,卷积层的滤波器是完全随机的,它们不会对任何特征激活(不能检测任何特征)。这就像刚出生的孩子,TA不知道什么是人脸、什么是狗,什么是上下左右。TA需要学习才知道这些概念,也就是通过接触人脸、狗、上下左右,并被告知这些东西分别是人脸、狗、上下左右。然后TA才能在头脑中记住这些概念,并在之后的某一次见到之后能准确的给出结果。

    把一个空白的滤波其,修改其权重(weights)以使它能检测特定的模式,整个过程就如工程里面的反馈。


    想想一下,如果有一只无意识的猴子,完全随机的修改一个5X5滤波器矩阵的25个值,那完全可能经过一定的轮次之后,这个滤波器能够检测棱角等特征。这是一种无反馈的训练情况。对神经网络的训练当然不能如此,我们不可能靠运气去做这件事情。

    举个例子,我们要训练一个用于分类的神经网络,让它能判定输入图像中的物体最可能是十个类别的哪一类。那么,训练过程就是这样的:

    第一次训练,输入一张图像,这个图像通过各层卷积处理输出量一组向量[1,1,1,1,1,1,1,1,1,1], 也就是,对于完全由随机滤波器构建的网络,其输出认为这张图等概率的是十个类别中的某一种。但是对于训练,我们有一个Gound Thuth, 也就是这张图中物体所属的类别:[0,0,1,0,0,0,0,0,0,0],也就是属于第三类。这时候我们可以定义一个损失函数,比如常见的MSE(mean squared error).我们假定L是这个损失函数的输出。这时候我们的目的就是,让L的值反馈(这种神经网络概念下称为 back propagation, 反向传输)给整个卷积神经网络,以修改各个滤波器的权重,使得损失值L最小。


    这是一个典型的最优化问题。当然地,在工程上我们几乎不可能一次就把滤波器的权重W修改到使L最小的情况,而是需要多次训练和多次修改


    如果情况理想的话,权重修改的方向是使得L的变化收敛的。这也就是说很可能达到了我们训练这个神经网络的目的——让各个卷积层的滤波器能够组合起来最优化的检测特定的模式。

    展开全文
  • 大白话讲解卷积神经网络工作原理

    千次阅读 2018-11-10 16:57:21
    本文介绍了计算机视觉常用工具:卷积神经网络。用大白话讲解了其应用领域、卷积、池化(下采样)、全连接、...本文配套B站视频:大白话讲解卷积神经网络工作原理 强烈建议先看上面两个视频再阅读本文! 作者:张子...

    本文介绍了计算机视觉常用工具:卷积神经网络。用大白话讲解了其应用领域、卷积、池化(下采样)、全连接、梯度下降、反向传播算法。并用三维可视化工具展示了手写字体识别的卷积神经网络案例,最后介绍了几个经典的卷积神经网络模型以及一些新手易上手的计算机视觉开源项目。

    本文配套B站视频:三分钟走进卷积神经网络

    本文配套B站视频:大白话讲解卷积神经网络工作原理

    强烈建议先看上面两个视频再阅读本文!

    作者:张子豪(同济大学在读研究生)

    关注微信公众号 人工智能小技巧 回复 卷积神经网络 或者 CNN 即可看到文中的B站视频、Gif动画、三维可视化卷积神经网络网站

    于2018-11-10发布

    1、卷积神经网络应用领域

    卷积神经网络可以处理图像以及一切可以转化成类似图像结构的数据。相比传统算法和其它神经网络,卷积神经网络能够高效处理图片的二维局部信息,提取图片特征,进行图像分类。通过海量带标签数据输入,用梯度下降和误差反向传播的方法训练模型。

    图像分类

    图像识别

    人脸识别

    人脸识别

    Github开源人脸识别项目face_recognition中文文档

    自动驾驶

    车道识别

    语音处理:将时序声音转化为类似图像的数据结构

    卷积神经网络处理语音

    自然语言处理:将文本序列转化为类似图像的数据结构

    卷积神经网络处理文本信息

    2、三维可视化手写字体识别卷积神经网络内部结构

    网站:三维可视化卷积神经网络
    http://scs.ryerson.ca/~aharley/vis/conv/

    关注微信公众号 人工智能小技巧 回复 卷积神经网络 即可看到这个手写字体可视化网站。

    可视化手写字体识别卷积神经网络

    卷积神经网络识别手写字体步骤

    LeNet-5

    卷积神经网络工作流程

    1、把手写字体图片转换成像素矩阵

    2、对像素矩阵进行第一层卷积运算,生成六个feature map

    3、对每个feature map进行下采样(也叫做池化),在保留feature map特征的同时缩小数据量。生成六个小图,这六个小图和上一层各自的feature map长得很像,但尺寸缩小了。

    4、对六个小图进行第二层卷积运算,生成更多feature map

    5、对第二次卷积生成的feature map进行下采样

    6、第一层全连接层

    7、第二层全连接层

    8、高斯连接层,输出结果

    关注微信公众号 人工智能小技巧 回复 卷积神经网络 或者 CNN 即可看到文中的B站视频、Gif动画、卷积神经网络可视化网站

    3、卷积神经网络内部结构

    卷积运算:识别图片中指定特征

    用卷积核在原图上滑动,进行卷积运算,得到特征图feature map。

    卷积的本质:将原图中符合卷积核特征的特征提取出来,展示在feature map里面。

    如果原图是X,卷积核是X,那么卷积核在原图上卷积运算之后生成的feature map也是X。

    如果原图是O,卷积核是O,那么卷积核在原图上卷积运算之后生成的feature map也是O。

    如果原图是O,卷积核是X,那么卷积核在原图上卷积运算之后生成的feature map就是乱码。

    权值共享:卷积核扫过整张图片的过程中,卷积核参数不变。

    下图的动画中,绿色表示原图像素值,红色数字表示卷积核中的参数,黄色表示卷积核在原图上滑动。右图表示卷积运算之后生成的feature map。

    卷积

    下图展示了RGB三个通道图片的卷积运算过程,共有两组卷积核,每组卷积核都有三个filter分别与原图的RGB三个通道进行卷积。每组卷积核各自生成一个feature map。

    多通道图片卷积

    原图最外圈补0:zero padding,便于提取图像边缘的特征。

    局部连接:feature map上每个值仅对应着原图的一小块区域,原图上的这块局部区域称作感受野(receptive field)。局部连接的思想,受启发于生物学里面的视觉系统,视觉皮层的神经元就是局部接受信息的。

    感受野

    感受野

    池化(下采样):保留特征的同时压缩数据量

    池化(Pooling)也叫做下采样(subsampling),用一个像素代替原图上邻近的若干像素,在保留feature map特征的同时压缩其大小。

    池化的作用:

    • 防止数据爆炸,节省运算量和运算时间。
    • 用大而化之的方法防止过拟合、过学习。防止培养出高分低能,在考场(训练集)称霸但在社会上(测试集)混不下去的人工智障。

    池化

    可以用这些像素的最大值作为代表,也可以用平均值作为代表。

    最大池化和平均池化

    下采样

    全连接:通过加权计算得出结果

    全连接

    全连接层:输出的每个神经元都和上一层每一个神经元连接。

    卷积核的数量、大小、移动步长、补0的圈数是事先人为根据经验指定的,全连接层隐藏层的层数、神经元个数也是人为根据经验指定的(这叫做超参数),但其内部的参数是训练出来的。

    在手写字体识别可视化卷积神经网络中,有两个全连接层:

    第一层全连接层:

    第一层全连接

    第二层全连接层:

    第二层全连接层

    输出结果:

    输出结果

    模型训练过程

    损失函数

    计算神经网络的推测结果与图片真实标签的差距,构造损失函数,训练的目标就是将找到损失函数的最小值。

    梯度下降

    将损失函数对各种权重、卷积核参数求导,慢慢优化参数,找到损失函数的最小值。

    梯度下降

    随机梯度下降

    在减小损失函数的过程中,采用步步为营的方法,单个样本单个样本输入进行优化,而不是将全部样本计算之后再统一优化。虽然个别样本会出偏差,但随着样本数量增加,仍旧能够逐渐逼近损失函数最小值。

    随机梯度下降

    前途是光明的,道路是曲折的。——《毛泽东选集》(第四卷)《关于重庆谈判》

    4、几个经典的卷积神经网络模型

    LeNet-5:识别手写字体的经典卷积神经网络

    LeNet-5模型是Yann LeCun教授于1998年在论文Gradient-based learning applied to document recognition中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。LeNet-5模型一共有7层。

    当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。Yann LeCun教授不是中国人,是法国人,在上世纪80年代读博期间提出“人工神经网络”,但后来该理论一度被认为过时,他本人甚至被拒绝参加学术会议。LenNet-5共有7层(不包括输入层),每层都包含不同数量的训练参数。

    LeNet-5

    李飞飞 imagenet 2009年开始成立ImageNet网站,采用众包模式,鼓励全世界志愿者上传、筛选、标注、整理图片数据。并每年组织ImageNet图像分类竞赛。

    AlexNet:2012年ImageNet竞赛冠军

    2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计,官方提供的数据模型,准确率达到57.1%,top 1-5 达到80.2%。AlexNet引爆了整个深度学习领域,更多学者开始研究卷积神经网络。

    AlexNet:2012年ImageNet竞赛冠军

    GoogLeNet:2014年ImageNet冠军

    GoogleNet

    VGGNet:2014年ImageNet亚军

    牛津大学的VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet。但是VGG模型在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。它的缺点在于,参数量有140M之多,需要更大的存储空间。但是这个模型很有研究价值。

    VGGNet

    ResNet深度残差卷积神经网络

    ResNet在2015年ImageNet比赛分类任务中获得第一名,在图像分类方面已超过人眼。ResNet共有152层,但它不仅仅靠深度取胜,而是通过残差学习的方法训练模型,通过“跨层抄近道”的方法减少参数数量,简单而实用。衍生出ResNet50和ResNet101旁支,Alpha Zero(只训练8个小时就打败了AlphaGo的下棋机器)也使用了ResNet。

    ResNet的作者何恺明是2003年广东省理科高考状元,本科毕业于清华大学,博士毕业于香港中文大学,曾在微软亚洲研究院孙剑领导的研究组实习。何恺明在图像去雾领域也成果颇丰。

    ResNet

    ResNet

    各种模型识别成功率比较

    各种冠军神经网路图像分类成功率

    top1和top5是什么?

    每次识别图片,模型都会给出它认为最像的前五个结果。top1指的是模型认为最像的确实是真实答案的成功率。top5指的是模型认为最像的前五个里有真实答案的成功率。

    ImageNet竞赛错误率逐年下降

    ImageNet竞赛错误率逐年下降

    LeCun教授、李飞飞、Hinton、Alex、何恺明都是人工智能领域的泰山北斗,

    5、一些轻松易上手的计算机视觉项目

    微软年龄测试API

    官方主页

    微软年龄测试工具

    自动生成图片描述—captionbot

    官方网站

    微软captionbot

    微软Custom Vision —不用写代码,三分钟开发一个图像分类应用

    B站视频:用微软Custom Version识别水果

    快速测试

    Github开源人脸识别项目face_recognition

    face_recognition项目中文介绍

    face_recognition开源项目

    识别面部关键点

    在树莓派微型电脑上安装OpenCV

    子豪兄教你在树莓派微型电脑上安装OpenCV

    连接树莓派摄像头Picamera

    视频剪辑师的福音—微软Video Indexer

    官方主页http://videoindexer.ai

    Video Indexer是非常强大的视频和音频处理工具,用户只需上传视频或音频,即可得到关键词分析、时间线字幕、视频中出现的名人及其讲话时段、情绪分析、关键帧以及带字幕和字幕翻译的视频。

    视频样本

    字幕

    翻译

    6、参考文献与扩展阅读

    本文配套B站视频:三分钟走进卷积神经网络

    本文配套B站视频:大白话讲解卷积神经网络工作原理

    用微软Custom Version识别水果:三分钟开发人工智能小应用

    三维可视化卷积神经网络

    视频:李飞飞TED演讲: 我们怎么教计算机理解图片?

    视频:How Convolutional Neural Networks work

    ImageNet图片网站

    卷积神经网络中的池化方法(pooling)总结

    大话CNN经典模型:VGGNet

    一个时代的终结:ImageNet 竞赛 2017 是最后一届

    ResNet解析

    零基础入门深度学习(4) - 卷积神经网络

    微软开源人工智能工具和深度学习框架

    学堂在线慕课:微软人工智能-深度学习框架和工具

    用Microsoft Custom Vision技术识别点东西吧

    微软亚洲研究院

    微软亚洲研究院20年20人

    作者介绍:

    张子豪,同济大学在读研究生。微信公众号 人工智能小技巧 运营者。致力于用人类能听懂的语言向大众科普人工智能前沿科技。目前正在制作《说人话的人工智能视频教程》、《零基础入门树莓派趣味编程》等视频教程。西南地区人工智能爱好者高校联盟联合创始人,重庆大学人工智能协会联合创始人。充满好奇的终身学习者、崇尚自由的开源社区贡献者、乐于向零基础分享经验的引路人、口才还不错的程序员。

    说人话的零基础深度学习、数据科学视频教程、树莓派趣味开发视频教程等你来看!

    微信公众号:人工智能小技巧

    知乎专栏:人工智能小技巧

    Github代码仓库:TommyZihao

    个人主页:www.python666.org

    同济大学开源软件协会
    同济大学微软学生俱乐部
    西南人工智能爱好者联盟
    重庆大学人工智能协会

    休息一下

    展开全文
  • CNN卷积神经网络工作原理总结

    万次阅读 多人点赞 2018-09-16 17:09:57
    CNN卷积神经网络工作原理总结 本文主要对吴恩达深度学习中卷积神经网络的课程进行了学习,下面是CNN工作原理总结。 1.边缘检测 ========== 在学习CNN的工作原理时首先从图像识别入手。要想让计算机识别一张图片...

    CNN卷积神经网络工作原理总结

    本文主要对吴恩达深度学习中卷积神经网络的课程进行了学习,下面是CNN工作原理总结。

    1.边缘检测

    ==========
    在学习CNN的工作原理时首先从图像识别入手。要想让计算机识别一张图片上有什么物体,首先要做的就是对图片的边缘检测。这里就用到一个过滤器,如下图所示,我们把图像以6x6的像素以矩阵的形式作为网络的输入,这时候定义一个垂直边缘过滤器,过滤器filter尺寸为3x3,定义过滤器的步长stride为1,为过滤器设定初始超级参数。过滤器在图像上逐步滑动,对整个图像进行卷积计算得到一个4x4的图像。以左上角的-5为例
    3*1+0*0+1*-1+1*1+5*0+8*-1+2*1+7*0+2*-1 = -5(这里的*表示乘积运算)
    这里写图片描述

    那么为什么进过过滤器的卷积计算就可以识别出图像的边缘,如下图所示,0表示图像暗色区域,10为图像比较亮的区域,同样用一个3x3过滤器,对图像进行卷积,得到的图像中间亮,两边暗,亮色区域就对应图像边缘。 这里的边缘看起来有点粗是因为我们当前输入的图片比较小,如果如果输入时一个1000x1000的图像或者更大一些效果就会很好。
    这里写图片描述
    同样的道理我们可以定义水平过滤器如下图所示,这时候我们得到的输出就是对图像水平边缘检测得到的结果。
    这里写图片描述
    除了上面提到的这种简单的Vertical、Horizontal过滤器之外,还有其它常用的filters,例如Sobel filter和Scharr filter。这两种滤波器的特点是增加图片中心区域的权重,当然这些都是研究者们计算好的过滤器,在检测复杂图像时还可以通过反向传播来让网络学习过滤器的参数,通过学习获得的参数可能是最好的,因为它可以识别任意角度的边缘。
    这里写图片描述

    2 padding填充

    过滤器在图片上进行卷积计算时,图片的边缘位置的信息可能会被忽略,因为经过多次卷积之后图片会越来越小,边缘信息会被遗漏,基于这一问题的解决提出了Padding。为了避免忽略图像中的边缘信息,对输入的图像进行填充之后在进行卷积,如下图所示,填充的像素值用0来代替,这样就可以避免边缘信息由于卷积的次数少而被忽略。
    这里写图片描述

    3 Strided卷积步长

    Stride表示filter在原图片中水平方向和垂直方向每次的步进长度。如下图所示。当步长设置为2的时候过滤器在图片上卷积完第一个3x3的矩阵之后向后移动两行进行卷积。
    这里写图片描述
    用s表示stride长度,p表示padding长度,如果原始图片尺寸为n x n,filter尺寸为f x f,则卷积后的图片尺寸为:
    这里写图片描述
    如果(n+2*p-f)/s的商不是整数,那么向下取整。

    4 立体卷积

    在这里输入图片为彩色图片,从红绿蓝三个通道进行对图片的特征提取。如下图所示,红绿蓝分别作为三种不同的通道,可以看成是三个输入矩阵,而对应这三个通道的过滤器也同样保持三维的通道与其保持一致,在卷积进行时过滤器的每一层分别与图像的每一个通道进行卷积,最后得到一个4x4的输出,在下面这张图片中用了两个过滤器,最终经过两个过滤器的卷积得到一个4x4x2的输出。
    这里写图片描述
    例如输入图片是6x6x3,分别表示图片的高度(height)、宽度(weight)和通道(#channel),过滤器通道也必须为3,可以是3x3x3也可以是5x5x3,即尺寸可以按需定制,而通道必须一致。
    为了进行多个卷积运算,实现更多边缘检测,可以增加更多的滤波器组。例如设置第一个过滤器实现垂直边缘检测,第二个过滤器实现水平边缘检测。这样,不同过滤器卷积得到不同的输出,个数由滤波器组决定。
    在这一部分中,输入为n x n x nc 过滤器为 f x f x nc
    最终得到输出图片大小为n – f + 1 x n – f + 1 x n_c
    其中n为输入矩阵大小。 nc 为输入维数,f为过滤器大小,n_c为过滤器个数。

    5 单层卷积网络

    在上一部分中图像通过两个过滤器得到了两个4x4的矩阵,在两个矩阵上分别加入偏差b1和b2,然后对加入偏差的矩阵做非线性的Relu变换,得到一个新的4*4矩阵,这就是单层卷积网络的完整计算过程。用公式表示:
    z[1]=w[1]a[0]+b[1]z[1]=w[1]a[0]+b[1]
    a[1]=g(z[1])a[1]=g(z[1])
    其中输入图像为a[0],过滤器用w[1]表示,对图像进行线性变化并加入偏差得到矩阵z[1],a[1]是应用Relu激活后的结果。如下图所示。
    这里写图片描述

    6 Pooling池化层

    在这一层中主要的作用是处理卷积之后生成的图片,减小模型大小,提高计算速度,并提高提取特征的鲁棒性。所以在pooling中一般不用padding填充。
    池化分为最大池化和平均池化。最大池化思想很简单,以下图为例,把4x4的图像分割成4个不同的区域,然后输出每个区域的最大值,这就是最大池化所做的事情。其实这里我们选择了2x2的过滤器,步长为2。在一幅真正的图像中提取最大值可能意味着提取了某些特定特征,比如垂直边缘、一只眼睛等等。平均池化就是在输出中取的是每一个区域的平均值,最大池化使用比较多。
    这里写图片描述

    7 简单卷积神经网络

    如下图所示,这部分通过一个例子介绍简单卷积神经网络的整体实现流程。在这个Demo中我们假定输入为一个39x39x3的图片,在第一层CONV1中定义10个过滤器,每个过滤器中f=3,s=1,p=0,经过卷积之后得到一个28x28x6的输出,之后对CONV1输出的结果进行最大池化处理,这里的池化参数为f=2,s=2,经过池化处理后得到14x14x6的输出,这时候将输出送入到第二个卷积层进行卷积,定义CONV2中的过滤器参数f=5,s=1,经过CONV2得到一个10x10x16的输出,再对这时的输出进行最大池化处理,定义Pooling2的参数为f=2,s=2,得到5x5x16的输出,这时将Pooling2之后得到的输出送入全连接层。此时就可以把Pooling2的输出看成是普通全连接神经网络的第一层的出入。再进过全连接层中各节点之间的映射和相互激活最后产生输出值。这就是CNN的整个工作过程。
    这里写图片描述

    展开全文
  • 卷积神经网络工作原理直观的解释

    万次阅读 多人点赞 2018-06-22 10:55:07
    1、卷积神经网络工作原理做一个直观的解释2、Architecture of Convolutional Neural Networks (CNNs) demystified3、机器视角:长文揭秘图像处理和卷积神经网络架构4、手写体识别网络结构剖析可视化作者:机器之心...

    1、卷积神经网络工作原理做一个直观的解释

    作者:机器之心
    链接:https://www.zhihu.com/question/39022858/answer/203073911
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    引言

    先坦白地说,有一段时间我无法真正理解深度学习。我查看相关研究论文和文章,感觉深度学习异常复杂。我尝试去理解神经网络及其变体,但依然感到困难。

    接着有一天,我决定一步一步,从基础开始。我把技术操作的步骤分解开来,并手动执行这些步骤(和计算),直到我理解它们如何工作。这相当费时,且令人紧张,但是结果非凡。

    现在,我不仅对深度学习有了全面的理解,还在此基础上有了好想法,因为我的基础很扎实。随意地应用神经网络是一回事,理解它是什么以及背后的发生机制是另外一回事。

    今天,我将与你共享我的心得,展示我如何上手卷积神经网络并最终弄明白了它。我将做一个通盘的展示,从而使你对 CNN 的工作机制有一个深入的了解。

    在本文中,我将会讨论 CNN 背后的架构,其设计初衷在于解决图像识别和分类问题。同时我也会假设你对神经网络已经有了初步了解。

    目录

    1.机器如何看图?

    2.如何帮助神经网络识别图像?

    3.定义卷积神经网络

    • 卷积层
    • 池化层
    • 输出层

    4.小结

    5.使用 CNN 分类图像

    1. 机器如何看图?

    人类大脑是一非常强大的机器,每秒内能看(捕捉)多张图,并在意识不到的情况下就完成了对这些图的处理。但机器并非如此。机器处理图像的第一步是理解,理解如何表达一张图像,进而读取图片。

    简单来说,每个图像都是一系列特定排序的图点(像素)。如果你改变像素的顺序或颜色,图像也随之改变。举个例子,存储并读取一张上面写着数字 4 的图像。

    基本上,机器会把图像打碎成像素矩阵,存储每个表示位置像素的颜色码。在下图的表示中,数值 1 是白色,256 是最深的绿色(为了简化,我们示例限制到了一种颜色)。



    一旦你以这种格式存储完图像信息,下一步就是让神经网络理解这种排序与模式。


    2. 如何帮助神经网络识别图像?

    表征像素的数值是以特定的方式排序的。

    假设我们尝试使用全连接网络识别图像,该如何做?


    全连接网络可以通过平化它,把图像当作一个数组,并把像素值当作预测图像中数值的特征。明确地说,让网络理解理解下面图中发生了什么,非常的艰难。

    即使人类也很难理解上图中表达的含义是数字 4。我们完全丢失了像素的空间排列。

    我们能做什么呢?可以尝试从原图像中提取特征,从而保留空间排列。


    案例 1

    这里我们使用一个权重乘以初始像素值。

    现在裸眼识别出这是「4」就变得更简单了。但把它交给全连接网络之前,还需要平整化(flatten) 它,要让我们能够保留图像的空间排列。


    案例 2

    现在我们可以看到,把图像平整化完全破坏了它的排列。我们需要想出一种方式在没有平整化的情况下把图片馈送给网络,并且还要保留空间排列特征,也就是需要馈送像素值的 2D/3D 排列。

    我们可以尝试一次采用图像的两个像素值,而非一个。这能给网络很好的洞见,观察邻近像素的特征。既然一次采用两个像素,那也就需要一次采用两个权重值了


    希望你能注意到图像从之前的 4 列数值变成了 3 列。因为我们现在一次移用两个像素(在每次移动中像素被共享),图像变的更小了。虽然图像变小了,我们仍能在很大程度上理解这是「4」。而且,要意识到的一个重点是,我们采用的是两个连贯的水平像素,因此只会考虑水平的排列。


    这是我们从图像中提取特征的一种方式。我们可以看到左边和中间部分,但右边部分看起来不那么清楚。主要是因为两个问题:


    1. 图片角落左边和右边是权重相乘一次得到的。

    2. 左边仍旧保留,因为权重值高;右边因为略低的权重,有些丢失。


    现在我们有两个问题,需要两个解决方案。


    案例 3

    遇到的问题是图像左右两角只被权重通过一次。我们需要做的是让网络像考虑其他像素一样考虑角落。我们有一个简单的方法解决这一问题:把零放在权重运动的两边。


    你可以看到通过添加零,来自角落的信息被再训练。图像也变得更大。这可被用于我们不想要缩小图像的情况下。


    案例 4

    这里我们试图解决的问题是右侧角落更小的权重值正在降低像素值,因此使其难以被我们识别。我们所能做的是采取多个权重值并将其结合起来。


    (1,0.3) 的权重值给了我们一个输出表格


    同时表格 (0.1,5) 的权重值也将给我们一个输出表格。

    两张图像的结合版本将会给我们一个清晰的图片。因此,我们所做的是简单地使用多个权重而不是一个,从而再训练图像的更多信息。最终结果将是上述两张图像的一个结合版本。


    案例 5

    我们到现在通过使用权重,试图把水平像素(horizontal pixel)结合起来。但是大多数情况下我们需要在水平和垂直方向上保持空间布局。我们采取 2D 矩阵权重,把像素在水平和垂直方向上结合起来。同样,记住已经有了水平和垂直方向的权重运动,输出会在水平和垂直方向上低一个像素。



    特别感谢 Jeremy Howard 启发我创作了这些图像。

    因此我们做了什么?

    上面我们所做的事是试图通过使用图像的空间的安排从图像中提取特征。为了理解图像,理解像素如何安排对于一个网络极其重要。上面我们所做的也恰恰是一个卷积网络所做的。我们可以采用输入图像,定义权重矩阵,并且输入被卷积以从图像中提取特殊特征而无需损失其有关空间安排的信息。

    这个方法的另一个重大好处是它可以减少图像的参数数量。正如所见,卷积图像相比于原始图像有更少的像素。

    3.定义一个卷积神经网络

    我们需要三个基本的元素来定义一个基本的卷积网络

    1. 卷积层

    2. 池化层(可选)

    3. 输出层


    卷积层

    在这一层中,实际所发生的就像我们在上述案例 5 中见到的一样。假设我们有一个 6*6 的图像。我们定义一个权值矩阵,用来从图像中提取一定的特征。

    我们把权值初始化成一个 3*3 的矩阵。这个权值现在应该与图像结合,所有的像素都被覆盖至少一次,从而来产生一个卷积化的输出。上述的 429,是通过计算权值矩阵和输入图像的 3*3 高亮部分以元素方式进行的乘积的值而得到的。



    现在 6*6 的图像转换成了 4*4 的图像。想象一下权值矩阵就像用来刷墙的刷子。首先在水平方向上用这个刷子进行刷墙,然后再向下移,对下一行进行水平粉刷。当权值矩阵沿着图像移动的时候,像素值再一次被使用。实际上,这样可以使参数在卷积神经网络中被共享。


    下面我们以一个真实图像为例。

    权值矩阵在图像里表现的像一个从原始图像矩阵中提取特定信息的过滤器。一个权值组合可能用来提取边缘(edge)信息,另一个可能是用来提取一个特定颜色,下一个就可能就是对不需要的噪点进行模糊化。

    先对权值进行学习,然后损失函数可以被最小化,类似于多层感知机(MLP)。因此需要通过对参数进行学习来从原始图像中提取信息,从而来帮助网络进行正确的预测。当我们有多个卷积层的时候,初始层往往提取较多的一般特征,随着网络结构变得更深,权值矩阵提取的特征越来越复杂,并且越来越适用于眼前的问题。


    步长(stride)和边界(padding)的概念

    像我们在上面看到的一样,过滤器或者说权值矩阵,在整个图像范围内一次移动一个像素。我们可以把它定义成一个超参数(hyperparameter),从而来表示我们想让权值矩阵在图像内如何移动。如果权值矩阵一次移动一个像素,我们称其步长为 1。下面我们看一下步长为 2 时的情况。



    你可以看见当我们增加步长值的时候,图像的规格持续变小。在输入图像四周填充 0 边界可以解决这个问题。我们也可以在高步长值的情况下在图像四周填加不只一层的 0 边界。

    我们可以看见在我们给图像填加一层 0 边界后,图像的原始形状是如何被保持的。由于输出图像和输入图像是大小相同的,所以这被称为 same padding。



    这就是 same padding(意味着我们仅考虑输入图像的有效像素)。中间的 4*4 像素是相同的。这里我们已经利用边界保留了更多信息,并且也已经保留了图像的原大小。


    多过滤与激活图

    需要记住的是权值的纵深维度(depth dimension)和输入图像的纵深维度是相同的。权值会延伸到输入图像的整个深度。因此,和一个单一权值矩阵进行卷积会产生一个单一纵深维度的卷积化输出。大多数情况下都不使用单一过滤器(权值矩阵),而是应用维度相同的多个过滤器。


    每一个过滤器的输出被堆叠在一起,形成卷积图像的纵深维度。假设我们有一个 32*32*3 的输入。我们使用 5*5*3,带有 valid padding 的 10 个过滤器。输出的维度将会是 28*28*10。


    如下图所示:


    激活图是卷积层的输出。


    池化层

    有时图像太大,我们需要减少训练参数的数量,它被要求在随后的卷积层之间周期性地引进池化层。池化的唯一目的是减少图像的空间大小。池化在每一个纵深维度上独自完成,因此图像的纵深保持不变。池化层的最常见形式是最大池化。


    在这里,我们把步幅定为 2,池化尺寸也为 2。最大化执行也应用在每个卷机输出的深度尺寸中。正如你所看到的,最大池化操作后,4*4 卷积的输出变成了 2*2。

    让我们看看最大池化在真实图片中的效果如何。



    正如你看到的,我们卷积了图像,并最大池化了它。最大池化图像仍然保留了汽车在街上的信息。如果你仔细观察的话,你会发现图像的尺寸已经减半。这可以很大程度上减少参数。


    同样,其他形式的池化也可以在系统中应用,如平均池化和 L2 规范池化。


    输出维度

    理解每个卷积层输入和输出的尺寸可能会有点难度。以下三点或许可以让你了解输出尺寸的问题。有三个超参数可以控制输出卷的大小。


    1. 过滤器数量-输出卷的深度与过滤器的数量成正比。请记住该如何堆叠每个过滤器的输出以形成激活映射。激活图的深度等于过滤器的数量。

    2. 步幅(Stride)-如果步幅是 1,那么我们处理图片的精细度就进入单像素级别了。更高的步幅意味着同时处理更多的像素,从而产生较小的输出量。

    3. 零填充(zero padding)-这有助于我们保留输入图像的尺寸。如果添加了单零填充,则单步幅过滤器的运动会保持在原图尺寸。


    我们可以应用一个简单的公式来计算输出尺寸。输出图像的空间尺寸可以计算为([W-F + 2P] / S)+1。在这里,W 是输入尺寸,F 是过滤器的尺寸,P 是填充数量,S 是步幅数字。假如我们有一张 32*32*3 的输入图像,我们使用 10 个尺寸为 3*3*3 的过滤器,单步幅和零填充。


    那么 W=32,F=3,P=0,S=1。输出深度等于应用的滤波器的数量,即 10,输出尺寸大小为 ([32-3+0]/1)+1 = 30。因此输出尺寸是 30*30*10。


    输出层

    在多层卷积和填充后,我们需要以类的形式输出。卷积和池化层只会提取特征,并减少原始图像带来的参数。然而,为了生成最终的输出,我们需要应用全连接层来生成一个等于我们需要的类的数量的输出。仅仅依靠卷积层是难以达到这个要求的。卷积层可以生成 3D 激活图,而我们只需要图像是否属于一个特定的类这样的内容。输出层具有类似分类交叉熵的损失函数,用于计算预测误差。一旦前向传播完成,反向传播就会开始更新权重与偏差,以减少误差和损失。


    4. 小结

    正如你所看到的,CNN 由不同的卷积层和池化层组成。让我们看看整个网络是什么样子:



    • 我们将输入图像传递到第一个卷积层中,卷积后以激活图形式输出。图片在卷积层中过滤后的特征会被输出,并传递下去。
    • 每个过滤器都会给出不同的特征,以帮助进行正确的类预测。因为我们需要保证图像大小的一致,所以我们使用同样的填充(零填充),否则填充会被使用,因为它可以帮助减少特征的数量。
    • 随后加入池化层进一步减少参数的数量。
    • 在预测最终提出前,数据会经过多个卷积和池化层的处理。卷积层会帮助提取特征,越深的卷积神经网络会提取越具体的特征,越浅的网络提取越浅显的特征。
    • 如前所述,CNN 中的输出层是全连接层,其中来自其他层的输入在这里被平化和发送,以便将输出转换为网络所需的参数。
    • 随后输出层会产生输出,这些信息会互相比较排除错误。损失函数是全连接输出层计算的均方根损失。随后我们会计算梯度错误。
    • 错误会进行反向传播,以不断改进过滤器(权重)和偏差值。
    • 一个训练周期由单次正向和反向传递完成。

    5. 在 KERAS 中使用 CNN 对图像进行分类

    让我们尝试一下,输入猫和狗的图片,让计算机识别它们。这是图像识别和分类的经典问题,机器在这里需要做的是看到图像,并理解猫与狗的不同外形特征。这些特征可以是外形轮廓,也可以是猫的胡须之类,卷积层会攫取这些特征。让我们把数据集拿来试验一下吧。


    以下这些图片均来自数据集。


    我们首先需要调整这些图像的大小,让它们形状相同。这是处理图像之前通常需要做的,因为在拍照时,让照下的图像都大小相同几乎不可能。


    为了简化理解,我们在这里只用一个卷积层和一个池化层。注意:在 CNN 的应用阶段,这种简单的情况是不会发生的。

    #import various packagesimport osimport numpy as npimport pandas as pdimport scipyimport sklearnimport kerasfrom keras.models import Sequentialimport cv2from skimage import io
    %matplotlib inline
    
    #Defining the File Path
    
    cat=os.listdir("/mnt/hdd/datasets/dogs_cats/train/cat")
    dog=os.listdir("/mnt/hdd/datasets/dogs_cats/train/dog")
    filepath="/mnt/hdd/datasets/dogs_cats/train/cat/"filepath2="/mnt/hdd/datasets/dogs_cats/train/dog/"#Loading the Images
    
    images=[]
    label = []for i in cat:
    image = scipy.misc.imread(filepath+i)
    images.append(image)
    label.append(0) #for cat imagesfor i in dog:
    image = scipy.misc.imread(filepath2+i)
    images.append(image)
    label.append(1) #for dog images
    
    #resizing all the imagesfor i in range(0,23000):
    images[i]=cv2.resize(images[i],(300,300))
    
    #converting images to arrays
    
    images=np.array(images)
    label=np.array(label)
    
    # Defining the hyperparameters
    
    filters=10filtersize=(5,5)
    
    epochs =5batchsize=128input_shape=(300,300,3)
    
    #Converting the target variable to the required sizefrom keras.utils.np_utils import to_categorical
    label = to_categorical(label)
    
    #Defining the model
    
    model = Sequential()
    
    model.add(keras.layers.InputLayer(input_shape=input_shape))
    
    model.add(keras.layers.convolutional.Conv2D(filters, filtersize, strides=(1, 1), padding='valid', data_format="channels_last", activation='relu'))
    model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
    model.add(keras.layers.Flatten())
    
    model.add(keras.layers.Dense(units=2, input_dim=50,activation='softmax'))
    
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.fit(images, label, epochs=epochs, batch_size=batchsize,validation_split=0.3)
    
    model.summary()
    


    在这一模型中,我只使用了单一卷积和池化层,可训练参数是 219,801。很好奇如果我在这种情况使用了 MLP 会有多少参数。通过增加更多的卷积和池化层,你可以进一步降低参数的数量。我们添加的卷积层越多,被提取的特征就会更具体和复杂。


    在该模型中,我只使用了一个卷积层和池化层,可训练参数量为 219,801。如果想知道使用 MLP 在这种情况下会得到多少,你可以通过加入更多卷积和池化层来减少参数的数量。越多的卷积层意味着提取出来的特征更加具体,更加复杂。


    结语

    希望本文能够让你认识卷积神经网络,这篇文章没有深入 CNN 的复杂数学原理。如果希望增进了解,你可以尝试构建自己的卷积神经网络,借此来了解它运行和预测的原理。


    展开全文
  • 深度学习--卷积神经网络工作原理

    千次阅读 2017-12-17 21:49:02
    从知乎上看一篇文章,问题是卷积神经网络工作原理直观的解释,知乎大神用各种动图对卷积神经网络的训练做了介绍。YJango的回答最为精彩。奉上链接,希望你也能从这个回答中对卷积神经网络有更为确切的认识。...
  • 卷积神经网络的核心思想就是设计多个卷积层,卷积层里设计一系列卷积核,输入数据经过卷积层中的卷积核处理,一...那么要理解卷积神经网络原理,就必须理解卷积核,而要理解卷积核,要从图像处理开始理解。 ...
  • 卷积神经网络(CNN)先放一张比较经典的图片初步了解一下卷积网络的结构,由于本文主要探讨卷积的作用,为了防止被自己带离节奏,这里不对该图做进一步解释,所以有感兴趣的可以参考AlexNet的讲解。但是如果你理解了此...
  • 卷积神经网络在图像识别领域无限风光,通过一张图片,算法可以知道图片上的物体是什么,着实令人震惊,但是很多人和我一样,对于其背后的原理,都非常好奇,卷积神经网络是如何进行图像识别的呢? 如果你的...
  • 查看全部 35 个回答 ...该文是卷积神经网络--介绍,并假设你理解前馈神经网络。 如果不是,强烈建议你读完如何简单形象又有趣地讲解神经网络是什么? 后再来读该篇。 目录 视觉感知 画面识别是什么识
  • 这是我见过讲卷积最好的文章
  • 卷积神经网络用在计算机视觉领域,是人工智能的一个分支。计算机视觉就是告诉计算机如何理解图像,包括人脸识别,自动驾驶等。不仅可以用于处理图像还可以处理音频,文本,只要数据能变成图像格式,他都能处理。 卷....
  • 卷积神经网络(Convolutional Neural Network, CNN)是人工神经网络的一种,是当下语音分析和图像识别领域的研究热点。 这篇文章用最简明的语言和最直观的图像,带你入门CNN。准备好了吗?Let’s go—— 我们先从最...
  • 本人只是出于兴趣研究这个话题,本人并非学者,或者从业者...卷积神经网络在图像识别领域无限风光,通过一张图片,算法可以知道图片上的物体是什么,着实令人震惊,但是很多人和我一样,对于其背后的原理,都非常好...
  • https://www.jianshu.com/p/544e2354b30a
  • 这些的解释,就要好好看看今年CVPR的文章Visualizing and Understanding Convolutional Networks 这篇文章写的很棒,而且2015 CVPR出了很多对于卷积神经网络理解的文章,这篇文章提出了一个反卷积的方法(De-...
  • 本文将带你加深理解神经网络如何工作于CNNs。原标题 | Gentle Dive into Math Behind Convolutional Neural Networks作 者 | Piotr Skalski翻 译 | 通夜(中山大学)、had_in(电子科技大学)编 辑 | Pita 自动...
  • I . 人类的视觉原理 II . 卷积神经网络 模仿 视觉原理 ... 卷积神经网络 工作流程 VI . 降低样本参数数量级 VII . 卷积计算 图示分析 VIII . 卷积计算 简介 IX . 卷积计算 示例 X . 卷积本质 XI . 卷积 计算 参数
  • 详细解读了卷积神经网络是如何工作的,从CNN卷积层、激活层、池化层到全链接层,及多层CNN作用进行了通熟易懂的讲解
  • 这次,我们将要使用卷积神经网络的思想来拓宽我们对神经网络工作原理的理解。简介过去我们接触到了密集连接的神经网络。那些神经网络中,所有的神经元被分成了若干组,形成了连续的层。每个这样的单元都与相邻层的每...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 458
精华内容 183
关键字:

卷积神经网络工作原理