深度学习:卷积神经网络(CNN)简介

本文转自:https://blog.csdn.net/lyxleft/article/details/79546990

1 背景介绍

      深度学习是近几年的热门研究话题。深度学习受到神经学的启示,模拟人脑的认知与表达过程,通过低层信号到高层特征的函数映射,来建立学习数据内部隐含关系的逻辑层次模型。深度学习相比于一般的浅层模型的机器学习方法具有多隐层结构,对大数据具有更好的拟合性。
     传统的图像处理仅是单张或为数不多的数字图像的处理,而在今天信息爆炸的时代,对图像的处理更多地涉及到视频(图像流)的分析,每一副图像可能有数十万个像素点,而一段多帧视频若有成百上千幅图像构成,其数据量足以媲美其他工业的"大数据"。传统的图像物体分类与检测算法及策略难以满足图像视频大数据在处理效率、性能和智能化等方面所提出的要求 。深度学习通过模拟类似人脑的层次结构建立从低级信号到高层语义的映射,以实现数据的分级特征表达,具有强大的视觉信息处理能力,因而, 在机器视觉领域,深度学习的代表--卷积神经网络(Convolutional Neural Network, CNN)得以广泛应用。

2 CNN详解

      20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(CNN) 。现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。实质上,CNN就是通过模仿细胞视觉信息的处理过程而构建的多层Hubel-Wiesel结构 。 
      CNN和普通的神经网络具有许多相似之处,它们都是模仿人类神经的结构,由具有可学习的权重和偏置常数的神经元组成。每一个神经元可以接收输入信号,经过运算后输出每一个分类的分数。但是,CNN的输入一般是图像,卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。CNN利用该特点,把神经元设计成具有三个维度:width, height, depth。

 

图 1 传统神经网络示意图

 

图 2 卷积神经网络(CNN)示意图

       那么,一个卷积神经网络由很多层组成,输入和输出均是三维的。有些层有参数,有些层则不需要参数。
       卷积神经网络通常包括以下几种"层":
      卷积层(Convolutional layer),卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
      线性整流层(Rectified Linear Units layer, ReLU layer),这一层神经的活性化函数(Activation function)使用线性整流(Rectified Linear Units, ReLU)f(x)=max(0,x)。
      池化层(Pooling layer),通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
      全连接层( Fully-Connected layer), 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。

2.1 卷积层

      卷积层的作用是通过对Hubel-Wiesel简单细胞的模拟检测其前驱层特征的局部连接。它是通过对输入图像进行多次卷积操作,提取出不同的特征图;然后把当前层的每个单元与前驱层的特征图局部块通过权值建立连接并进行局部加权和非线性变换。数学上,由特征映射实现的过滤操作被称为离散卷积,CNN也因此而得名。卷积层有以下几个关键点:

2.1.1局部感知(Local Connectivity)

      普通神经网络的输入层和隐含层为 "全连接(Full Connected)"的设计,这若沿用到卷积神经网络中,从计算的角度来讲,相对较小的图像从整幅图像中计算特征是可行的。但是,如果是更大存储量的图像,要通过这种全联通网络的这种方法来学习整幅图像上的特征,计算将变得非常耗时。举例来看,若设计104个输入单元,假设要学习的特征有100个,那么就有106个参数需要去学习。与28x28的小块图像相比较,96x96的图像使用前向输送或者后向传导的计算方式,计算过程也会慢102倍。
卷积层的本质便是解决此计算量爆炸的问题。它的方法是通过限制隐含单元和输入单元间的连接而实现:每个隐含单元仅仅只能连接输入单元的一部分,而非全部。每个隐含单元连接的输入区域大小称为该神经元的感受野(receptive field)。由于卷积层的神经元是三维结构,具有深度,卷积层的参数包含一系列的过滤器,每个过滤器训练一个深度。对于输出单元的不同深度处,与输入图像连接的区域是相同的,但是参数(过滤器)不同。
虽然每个输出单元只连接输入的一部分,但是值的计算方法是权重和输入的点积加上偏置,这与普通神经网络是一样的,如下图所示。

 

图 3 单个神经元的运算图示

2.1.2 空间排列

      如前文所述,一个输出单元的大小可由三个量控制,即:深度(depth), 步幅(stride),和补零(zero-padding)。
深度(depth) : 又名:depth column。顾名思义,它控制输出单元的深度,也就是filter的个数,表示连接同一块区域的神经元个数。
      步幅(stride):它控制在同一深度的相邻两个隐含单元,与他们相连接的输入区域的距离。若步幅很小(比如 stride = 1),相邻隐含单元的输入区域的重叠部分会很多; 步幅很大则重叠区域变少。
      补零(zero-padding) : 通过在输入单元周围补零来改变输入单元整体大小,从而控制输出单元的空间大小。
可以用以下公式计算一个维度(宽或高)内一个输出单元里可以有几个隐藏单元:

(W-F+2P)/S+1

      其中,W : 输入单元的大小(宽或高);F : 感受野(receptive field);S : 步幅(stride);P : 补零(zero-padding)的数量;K : 深度,输出单元的深度。
      如果计算结果不是一个整数,则说明现有参数不能正好适合输入,步幅(stride)设置的不合适,或者需要补零。

2.1.3 参数共享

      应用参数共享,可以大量减少参数数量。
      参数共享基于一个假设:如果图像中的一点(x1, y1)包含的特征很重要,那么它应该和图像中的另一点(x2, y2)一样重要。换种说法,我们把同一深度的平面叫做深度切片(depth slice),那么同一个切片应该共享同一组权重和偏置。我们仍然可以使用梯度下降的方法来学习这些权值,只需要对原始算法做一些小的改动。这里共享权值的梯度是所有共享参数的梯度的总和。
      为什么要权重共享呢?一方面,重复单元能够对特征进行识别,而不考虑它在可视域中的位置。另一方面,权值共享使得我们能更有效的进行特征抽取,因为它极大的减少了需要学习的自由变量的个数。通过控制模型的规模,卷积网络对视觉问题可以具有很好的泛化能力。

2.2 池化层

      池化即层下采样的过程,目的是为了减少特征图。
      池化本身的具体操作是:首先,通过粗粒化各特征的位置,避免相对位置导致所形成主题的微小变化,以此实现主题的可靠检测。其次,每个典型的池化单元通常计算一个或几个特征图内局部块的最大值;而相邻单元则通过行或列平移形成的块来获取输入数据,从而降低特征表达维度,并对平移和扭曲等较小形变具有鲁棒性。
      池化操作对每个深度切片独立,规模一般为 2*2,相对于卷积层进行卷积运算,池化层进行的运算一般有以下几种: 
        最大池化(Max Pooling)。取4个点的最大值。这是最常用的池化方法。 
        均值池化(Mean Pooling)。取4个点的均值。 
        高斯池化。借鉴高斯模糊的方法。不常用。 
        可训练池化。训练函数,接受4个点为输入,出入1个点。不常用。
    下图为规模为2*2, 步幅为2,对输入的每个深度切片进行下采样的示意图。每个最大池化操作对四个数进行,如下图所示。

 

图 4 2x2规模池化示意图

      池化操作将保存深度大小不变。如果池化层的输入单元大小不是2的整数倍,则一般采取边缘补零的方式补成2的倍数,然后再进行池化操作。

2.3 全连接层

      根据实际需要可以串联多个卷积、非线性变换和池化阶段,通常再叠加一个全连接层(即分类器) 来构建深度网络,然后通过BP算法等有监督地训练所有过滤器中的权值参数。
      全连接层和卷积层可以互相转换:对于一个卷积层,只要把权重变成一个维度巨大的矩阵,其中大部分元为0,对应局部感知的区块有值,并且由权重共享,配置好一些元表示的权值,令之相同,即可转变成全连接层。而对于一个全连接层也可以操作变为卷积层。例如,一个K=4096 的全连接层,输入层大小为 7∗7∗512,它可以等效为一个 F=7, P=0, S=1, K=4096 的卷积层。

2.4 整体架构

      常见的CNN架构是:多个"卷积层+整流层"后面加一个池化层,重复这样的结构模式多次,达到满意的效果后,最后用全连接层控制输出。

3 应用实例

      本部分介绍深度学习在图像处理与机器视觉领域的研究和应用实例。

3.1图像物体分类

      物体分类是机器视觉领域的基本问题,是更高级、更复杂的视觉问题的基础。物体的分类一般是通过一些特征对图像进行全局描述,利用分类器操作来判定图像中是否存在某类物体。对于图像数据,深度学习具有优秀的建模和特征提取能力,已经在物体分类的理论分析和实际应用中广泛应用。
     例如,Karpathy 等基于100万部含有487个类别的YouTube视频进行大规模的视频分类研究,通过多分辨率的小凹结构来加速CNN训练,使所提出的基于时空网络的模型相比传统上基于特征的模型在分类精度上具有明显提升。 
      Sanchez-Riera 等基 于 CNN 模 型 训 练 出 一 系 列 手 势 作 为样本来粗略预测手势的姿势和方向,并把此方法定义为一 个非严格模型算法;因为,即使其违反了手势平滑动作的时间 假设,此方法仍然可以获得手势的各项参数。 

3.2图像物体检测

      物体的检测更注重局部特征,它有别于分类问题,是回答一张图像中在什么位置存在一个什么物体,所以除特征表达外,物体结构是物体检测区别于物体分类的最明显特点 。 
Yi Sun等 基于CNN设计出一个DeepID人脸识别系统,并通过增加验证和识别信号在人脸识别挑战LFW (Labeled Faces in the Wild) 数据库上取得了99.15%的识别率,首次超越同样数据集上人97.52%的识别率,最终通过模型的进一步完善,使DeepID系统拥有非常好的遮挡鲁棒性,这一成果也展示了深度卷积神经网络在机器视觉领域的强大应用潜力。 除此之外,CNN在各类物体的检测中也有大量的应用实例,此处不作赘述。

4 CNN的发展前景

      目前,越来越多的视觉领域问题引入CNN得以良好解决,其算法展现出具有竞争力的结果。然而CNN也存在一些不足,例如训练、计算时间长,针对不同目的、场景,需要单独训练等问题。按文献[1]中对于深度学习的总结,我认为CNN作为目前典型的深度学习算法之一,也可以在建模问题和工程问题上做进一步的加强。相信在新一代先进的硬件设施面世后,基于深度模型架构通用性和统一性的视觉识别框架将会是机器视觉领域一致要求,深度卷积神经网络在机器视觉领域的舞台上定会发挥出更大的作用。



更多案例及完整代码请关注“思享会Club”公众号或者关注思享会博客:http://gkhelp.cn/

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 深度学习是当今计算机科学领域最为热门的研究方向之一,其在图像分类、语言识别、自然语言处理等诸多领域都有广泛的应用。而卷积神经网络CNN)是深度学习中最为核心的模型之一,它能够有效地提取图像的特征并进行分类。本文将介绍如何使用matlab搭建卷积神经网络。 首先,我们需要准备好所需的数据集,这是构建卷积神经网络的必要条件。可以在网上找到一些现成的数据集,如MNIST手写数字数据集,CIFAR-10图像分类数据集等等。 接下来,我们需要创建一个卷积神经网络。在matlab中,可以使用Deep Learning Toolbox来创建卷积神经网络模型。我们需要指定网络的层数、每层的神经元个数、激活函数等参数,以及网络的损失函数、优化算法等参数。 然后,我们需要将数据集分成训练集和测试集,并将其加载到matlab的工作空间中。可以使用matlab自带的数据集加载函数或者自己编写数据集加载函数来完成这一步骤。 接下来,我们需要对数据进行预处理,以便将其交给卷积神经网络进行训练。预处理包括图像的标准化、图像增强、数据扩充等操作。 最后,我们需要使用trainNetwork函数来训练我们的卷积神经网络,并使用testNetwork函数来测试网络的性能。网络训练完毕后,可以保存模型以备将来使用。 总的来说,用matlab进行卷积神经网络的搭建十分方便,并且matlab还提供了许多实用的工具箱和函数来辅助网络的训练和测试。若想深入研究深度学习,matlab是一个不错的选择。 ### 回答2: 深度学习是现代计算机科学的热门领域,它通过神经网络的层次结构来学习复杂的模式,特别是在图像、语音和自然语言处理上表现突出。Matlab是一种广泛用于数学建模、数据分析和科学计算的软件工具,也被用于深度学习领域。本文将介绍如何使用Matlab从零开始搭建卷积神经网络CNN。 首先,我们需要导入一些深度学习常用的库。例如 MatConvNet 和 VLFeat,这两个库都是由Matlab编写的,方便用户在Matlab中实现卷积神经网络。接下来,我们需要构建神经网络的模型,包括卷积层、池化层、全连接层等。这里,我们将使用卷积层、池化层交替的组合来搭建CNN模型,并设置相关的参数,例如数目、步长和大小等。 然后,我们需要准备好训练数据和测试数据,这些数据可以是图像、语音或文本等。我们需要将数据集进行预处理,例如归一化、预处理等,以确保数据数据量相等和格式标准化。接下来,我们需要定义模型的训练方法,例如使用反向传播算法以最小化误差和损失函数,而优化器可以选择常用的SGD、Adam或Adagrad等。 最后,我们需要对我们训练好的模型进行测试,测试过程中会给出一些输入样例,然后模型会输出对应的预测结果,我们可以根据这些结果来评估模型的性能和准确度。如果模型的性能不好,我们可以使用更多的层数、更多的节点或更多的数据来改善模型。 总之,使用Matlab搭建卷积神经网络的过程比较复杂,需要对深度学习的知识有一定的了解,并具备一定的程序能力。通过本文的介绍,相信读者能够初步了解到如何搭建卷积神经网络,并在实践中逐渐提高自己的能力。 ### 回答3: 在进行深度学习研究时,卷积神经网络(CNN)是一种非常常见的网络结构。使用Matlab可以高效地实现并训练CNN。下面将以一个简单的手写数字识别任务为例,从0开始介绍如何在Matlab中搭建和训练卷积神经网络。 首先需要导入手写数字数据集。在Matlab中已经内置了一个手写数字数据集,可以使用以下命令导入: ``` digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos','nndatasets','DigitDataset'); imds = imageDatastore(digitDatasetPath, 'IncludeSubfolders', true, 'LabelSource', 'foldernames'); ``` 接下来,需要设置网络结构和超参数。这里选择一个包含两个卷积层和两个全连接层的CNN,同时设置学习率、迭代轮数等超参数。 ``` layers = [ imageInputLayer([28 28 1]) convolution2dLayer(3,16,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,32,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(256) batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer]; options = trainingOptions('adam', ... 'MaxEpochs',20,... 'MiniBatchSize',128, ... 'InitialLearnRate',0.001, ... 'Shuffle','every-epoch', ... 'Verbose',false, ... 'Plots','training-progress'); ``` 然后可以开始训练模型。使用以下命令可以开始训练: ``` net = trainNetwork(imds,layers,options); ``` 最后,可以使用测试集对训练好的模型进行评估,并计算出模型的准确率: ``` YPred = classify(net,augimdsTest); YTest = imdsTest.Labels; accuracy = sum(YPred == YTest)/numel(YTest); ``` 通过这个例子,可以看出使用Matlab搭建和训练卷积神经网络是非常简单的。同时,Matlab提供了许多预训练模型和工具箱,可以方便地进行深度学习研究和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值