深度学习系列(十):从卷积计算到卷积神经网络CNN

前面已经介绍了深度学习的一个模型框架:自编码器,那么从本节后来再来简单介绍一下深度学习的另一个模型框架:卷积神经网络CNN,关于CNN可能大家听说过的不能在多了,网上资源众多,各路大神总结的也是无比完美,在这里就不在copy了,重要的地方直接直接贴出那些优秀的文章,这里旨在记录一下整个思路过程以及一些简单的认识以求完整。

首先贴一下网络上众多了讲解CNN的好资源吧:
(1)综述性的:

Deep Learning(深度学习)学习笔记整理系列之(七)

这篇推论非常好

CNN卷积神经网络推导和实现
一文读懂卷积神经网络

下面再简单总结下:
一)CNN来源
(1)来源1–需求需要
看过前面或者知道自编码器的可以发现,深层的自编码器其实已经可以实现类似于PCA甚至比PCA更好的特征提取了,而这个特征提取的过程也完全是机器自己完成的,我们根本不用管它具体提取的是什么特征,不像传统的设计特征提取(比如sift、hog等等人工设计的特征)那样,自编码的特征是自己找的,非常好。

但是我们也发现了一个问题,就是自编码网络其实和传统的神经网络差不多,不过深度多一点,但是本质上也是全连接的,就是下一层的每一个神经元与上一层的所有单元相连接着,像下面这个样子
这里写图片描述
我们知道前面我们处理的时手写体图像,每一个为28*28大小,也就是784输入向量,再加上很多隐含层,每一个隐含层又会有大量的单元连接,算一算在训练的时候得有多少参数呀,很多,所以呢,这种自编码式的深度学习虽然可以很好的学习特征,但是还是有限制的,那就是原始输入不能太大了,如果你来一个100*100=10000的图像就会受不了了,参数异常多。虽然不我们在前面也对自编码网络进行了各种优化(比如假如dropout,假如权值和限制、加入稀疏性限制等等)一系列举措,但是这在本质上还是没有减少网络参数众多这一问题,那么这就迫切需要一种方式来解决参数众多这一问题了,这就是CNN诞生的一个原因。

(2)来源2–视觉上的可行性
我们知道,就比如一副图像来说,像上面的那个网络,其实后一层的每个节点没必要和上一层的所有节点相连,如果后一层一个单元和前一层所有连接,变现出来就是下图的左边这个样子,其实呢他也可以用自编码器去找特征,就是参数非常多。而我们的图像在视觉机制上使什么样子的呢?就是图像上的某一部分的像素所表示的意义其实只和它周围的像素领域有关,比如下面这幅图假设爱因斯坦的眼睛中心这一个像素是不是只和它附近的像素有关而与其他地方的像素没有关系,这也是图像的空间特性,在很多地方,比如显著性分析、图像分割的时候,都会用到这种空间特性。那么我们何不将上面每个节点连接范围缩小呢?也就是下图的右边这个样子。这也叫做是局部感知。当然CNN减少参数的方式可不止这些。
这里写图片描述

二)关于卷积
所谓卷积,其实就是一种滤波方式。这在信号处理、图像处理上经常用到。最简单的在图像里面,一副图像和一个给定图像或者模版的进行卷积,卷积就是对应位置数据相乘然后再相加,比如像前面神经元与神经元全连接在一起的,假设他们是图像,对于其中一个隐含层的节点计算来说,拿出来其实就是一种卷积计算,像下面这样:
这里写图片描述
这是隐含层的全链接,那部分连接可能就不是I1~I9,可能只是I1~I3之类的与W1~W3卷积。

一个典型的部分连接其实可以等效为图像滤波一样,比如拉普拉斯滤波模版对图像滤波,像下面这样子:
这里写图片描述

比如对lena进行上述卷积操作(其实就是滤波)如下:

img = imread('lena.jpg');
img = rgb2gray(img);
% 图像大小:220*220
figure;subplot(1,2,1);imshow(img,[]);
% 拉普拉斯滤波模版 大小3*3
filter = [0 -1 0;-1 4 -1;0 -1 0];
%卷积计算
% 参数'valid'--对边缘不处理
% 得到的图像就是(220-3+1)=218*218的图像
img1 = convn(img,filter,'valid');
subplot(1,2,2);imshow(img1,[]);

得到如下所示:
这里写图片描述
这就是一个简单的与指定的小模版卷积结果,在CNN中,基本上都是这种与小模版进行的操作,就像上面给的爱因斯坦右边那个图那样子,不过在CNN中,区别于这里的是什么呢?那就是在CNN中,模版是我们事先不知道的(在这里我们人为设计了这个模版,也就是拉普拉斯模版),而是在训练的时候自己学习出来的,而且每一层我们可以学习很多个模版,就是对一副图进行好几次不同模版的滤波,得到好几个不同的卷积以后的图,在CNN中也叫做特征MAP。在cnn中我们需要设计的不过是模版的大小、模版的个数这些,至于是什么样的模版,就是靠自己学习而来的。

(三)关于卷积层
知道了图像与小模版的卷积概念后再来看看卷积层就很好理解了。
像上面,是对一副图像进行一个模版的卷积,那么我们可以定义好几个模版,分别依次卷积,像下面这样:
这里写图片描述
每一个卷积模版就好比是一个拉普拉斯模版那样子的,但是他们之间肯定是不一样的,不同的模版,不过模版中的值在CNN中就是需要学习的权值参数,而不是我们自己定的,其实我在想,在CNN的首层卷积层我们为什么不能自己定义一些比较好的模版,比如梯度检测算子、边缘检测算子等等,而在CNN的后面的卷积层让它自己学习好了。这样一副图像经过与好些个不同的模版卷积救护得到一些所谓的特征MAP了。在得到这些MAP后,我们可以发现,其实这些MAP本质上也是图像,那么我们对这些图像再进行后续的卷积如何呢?这就自然而然的引出了深层的卷积网络了。基于这样,我们在上面那个图后面在设计卷积模版,就会变成下面这样:
这里写图片描述
在这里呢我们假设卷积层C1下的每一个MAP又会衍生两个C2下的MAP,就是上面那样。但是在实际的CNN中,为了进一步减少参数,优化模型,通常早卷积层C1与C2之间还有一个降采样层S,什么意思呢?最简单就是对每一个C1下MAP进行缩小吧,比如缩小一倍,就是让C1下的每个MAP中每2*2的窗口取一个平均像素变成一个像素,这样就达到了缩小的目的了,这也就是降采样。像下面这样子。
这里写图片描述
之后可以再对C2进行降采样,在进行卷积,一直下去就是深度CNN了。

还有个问题就是,我们从S1到C2的时候,我们是选择S1中的一个map卷积得到下一个map,其实我们完全可以用S1中的两个甚至全部的3个MAP进行组合得到下一个MAP,组合方式可以是直接相加,比如说C2中每一个MAP都是S1中的所有MAP进行3个模版卷积然后相加而来的,那么此时的图就是下面这样子:
这里写图片描述
C2中的每一个MAP由S1中的3个MAP分别进行一个卷积,再把他们相加起来组合成一个MAP,注意的是从S1到C2的每一个卷积模版都是不一样的。那么想必前面一种可以看到,以前从S1到C2可能只要6个滤波模版,而现在呢需要18个模版,每个模版都是需要学习出来的。当然18个是最多的,如果后面每一个MAP不与前面的3个都相连接,而是2个或者1个,就不需要18个了。并且后一个MAP中每个与前面几个相连也不一定非得相同,比如C2中MAP1可能与S1的MAP1相连接,而C2中MAP2可能与S1的MAP1与MAP2相连接,等等。

好了看了这么多,再来看看手写体中的网络结构吧,就是这样子。详细的解释在上面的几个博客中都可以看到。
这里写图片描述

(四)关于CNN实验
对于CNN实验,前面谈及到的那个工具箱里面也集成了cnn代码。

DeepLearnToolbox

关于该工具箱的CNN讲解,下面几个讲的非常详细了,想详细研究的可以去看看

深度学习Matlab工具箱代码详解–deeptoolbox
Deep Learning论文笔记之(五)CNN卷积神经网络代码理解
  • 24
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值