CNN神经网络给图像分类(Matlab)(图神经网络图像分类)

CNN神经网络给图像分类(Matlab)(图神经网络图像分类),第1张

你的数据是另一种,而人工合成的图像由于添加非自然噪点。用MNIST训练网络,reg等。而是在确定结构上调整参数,数据集是一种分布,完全用数据集训练的模型就能得到一个还好的结果卷积的模板大小等?对于把流行数据集与自己数据混合训练模型的方法。如果你的数据量大到足以与数据集媲美,只训练后面的全连接层参数。如果自己的数据和数据集有些差别,用你自己的数据集,如果是1,但我认为结果不会太好。需要学习的话。但是对于流行数据集而言,无非是把CNN当成学习特征的手段,所以能用肉眼难分辨的噪声严重干扰分类结果,不满足模型假设。如果二者相差过大。然后cs231n与其问别人。如果是各种主题。如果是彩色数字,首先你去看UFLDL教程,那么可能不加自己的数据,而欺骗CNN的方法则主要出于,自然图像分布在一种流形结构中,1,自己的标注数据量一般不会太大:1000。cnn认为图像是局部相关的,后面的全连接层对应普通的神经网络做分类,你需要固定卷积池化层,learning rate,那么直接用你的数据训练网络即可,我没试过:100这种比例,也未尝不可,视你的数据量调整规模,先转成灰度,weight scale,首先你看了imageNet数据集了吗。CNN一是调整网络结构,前面的卷积层学习图像基本-中等-高层特征,你可以吧网络看成两部分,几层卷积几层池化。你用CNN做图像分类。而后用于分类的全连接层,训练的模型需要这种流形假设。如果两种数据十分相似。这时候只能把数据集用来训练cnn的特征提取能力,那混在一起我认为自己的是在用自己的数据当做噪声加到数据集中,用彩色的imageNET训练,放到一起训练。在流行的数据集上训练完你要看你的图像是什么怎么确实cnn全连接层的神经元数目

有 对CNN来说以batchsize的大小并行送入神经网络,经过一些卷积,到最后送入全连接层进行分类,送入全连接层之前的每个特征图已经被拉平(变成1xn的形式,这里的n就是x中的3,x中的10代表有10个1),所以下面的x中的10行可以理解为batchsize(即10张),x中的3列可以理解为每个被提取了3个特征,最后的y可以理解为对这10个进行一个5分类,分类的结果为这5个数中最大的那个数所对应的索引,具体分类的结果为索引对应的类别。
三、计算过程
计算原理的公式,可以理解为简单的线性方程。
已知输入x:
x=torchrandn([10,3])

输出:tensor([[-02022, -10258, -00116],
[ 04581, -14392, 07463],
[ 04723, 07842, 21767],
[-16525, -01205, -17498],
[-09119, -01080, 04499],
[-02130, 05349, -05764],
[ 08852, -02906, 04138],
[ 04349, 01988, 05386],
[ 12275, 03119, -07539],
[-03409, 03802, -06528]])
x为一个10行3列的tensor,也可以理解为矩阵,方便我们理解计算公式,也可以理解为10个样本(也就是神经网络中的batchsize=10),每个样本拥有3个特征(也就是channel=3)
定义一个全连接层:
lin=nnLinear(3,5)
输入通道为3,输出通道为5,也可以理解为将输入的3个特征转换成5个特征
将x带入全连接层得到y:
y=lin(x)
输出y为:
tensor([[-02761, 09752, -00340, 11611, 11389],
[-03531, -06225, 02387, 00675, -02862],
[-02320, 00627, 00128, 05417, 02288],
[-02319, 00789, -00258, 05046, 00307],
[ 01834, -05264, -03203, 03163, -01088],
[-00793, 00215, -01705, 05240, 00298],
[ 00977, -04148, -02549, 03503, -00740],
[-01738, 03037, -00414, 07681, 06529],
[ 03720, -06520, -04788, 03220, -00782],
[-01595, -10845, 00117, -02869, -11594]],
得到的y为一个10行5列的tensor,理解为原本每个样本拥有3个特征值,现在变成了5个。
可以理解为矩阵相乘,x10,3乘以A3,5得到y10,5 ( 我不知道这样理解对不)
神经网络的训练,训练的是A和b,找到一个合适的A和b使得y的值符合我们最后的结果

假设给定一张图(可能是字母X或者字母O),通过CNN即可识别出是X还是O,如下图所示,那怎么做到的呢

如果采用经典的神经网络模型,则需要读取整幅图像作为神经网络模型的输入(即全连接的方式),当图像的尺寸越大时,其连接的参数将变得很多,从而导致计算量非常大。
而我们人类对外界的认知一般是从局部到全局,先对局部有感知的认识,再逐步对全体有认知,这是人类的认识模式。在图像中的空间联系也是类似,局部范围内的像素之间联系较为紧密,而距离较远的像素则相关性较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模式就是卷积神经网络中降低参数数目的重要神器:局部感受野。

如果字母X、字母O是固定不变的,那么最简单的方式就是图像之间的像素一一比对就行,但在现实生活中,字体都有着各个形态上的变化(例如手写文字识别),例如平移、缩放、旋转、微变形等等,如下图所示:

我们的目标是对于各种形态变化的X和O,都能通过CNN准确地识别出来,这就涉及到应该如何有效地提取特征,作为识别的关键因子。
回想前面讲到的“局部感受野”模式,对于CNN来说,它是一小块一小块地来进行比对,在两幅图像中大致相同的位置找到一些粗糙的特征(小块图像)进行匹配,相比起传统的整幅图逐一比对的方式,CNN的这种小块匹配方式能够更好的比较两幅图像之间的相似性。如下图:

以字母X为例,可以提取出三个重要特征(两个交叉线、一个对角线),如下图所示:

假如以像素值"1"代表白色,像素值"-1"代表黑色,则字母X的三个重要特征如下:

那么这些特征又是怎么进行匹配计算呢?(不要跟我说是像素进行一一匹配的,汗!)

这时就要请出今天的重要嘉宾:卷积。那什么是卷积呢,不急,下面慢慢道来。
当给定一张新图时,CNN并不能准确地知道这些特征到底要匹配原图的哪些部分,所以它会在原图中把每一个可能的位置都进行尝试,相当于把这个feature(特征)变成了一个过滤器。这个用来匹配的过程就被称为卷积 *** 作,这也是卷积神经网络名字的由来。
卷积的 *** 作如下图所示:

是不是很像把毛巾沿着对角卷起来,下图形象地说明了为什么叫「卷」积

在本案例中,要计算一个feature(特征)和其在原图上对应的某一小块的结果,只需将两个小块内对应位置的像素值进行乘法运算,然后将整个小块内乘法运算的结果累加起来,最后再除以小块内像素点总个数即可(注:也可不除以总个数的)。
如果两个像素点都是白色(值均为1),那么1 1 = 1,如果均为黑色,那么(-1) (-1) = 1,也就是说,每一对能够匹配上的像素,其相乘结果为1。类似地,任何不匹配的像素相乘结果为-1。具体过程如下(第一个、第二个……、最后一个像素的匹配结果):

根据卷积的计算方式,第一块特征匹配后的卷积计算如下,结果为1

对于其它位置的匹配,也是类似(例如中间部分的匹配)

计算之后的卷积如下

以此类推,对三个特征图像不断地重复着上述过程,通过每一个feature(特征)的卷积 *** 作,会得到一个新的二维数组,称之为feature map。其中的值,越接近1表示对应位置和feature的匹配越完整,越是接近-1,表示对应位置和feature的反面匹配越完整,而值接近0的表示对应位置没有任何匹配或者说没有什么关联。如下图所示:

可以看出,当图像尺寸增大时,其内部的加法、乘法和除法 *** 作的次数会增加得很快,每一个filter的大小和filter的数目呈线性增长。由于有这么多因素的影响,很容易使得计算量变得相当庞大。

为了有效地减少计算量,CNN使用的另一个有效的工具被称为“池化(Pooling)”。池化就是将输入图像进行缩小,减少像素信息,只保留重要信息。
池化的 *** 作也很简单,通常情况下,池化区域是2 2大小,然后按一定规则转换成相应的值,例如取这个池化区域内的最大值(max-pooling)、平均值(mean-pooling)等,以这个值作为结果的像素值。
下图显示了左上角2 2池化区域的max-pooling结果,取该区域的最大值max(077,-011,-011,100),作为池化后的结果,如下图:

池化区域往左,第二小块取大值max(011,033,-011,033),作为池化后的结果,如下图:

其它区域也是类似,取区域内的最大值作为池化后的结果,最后经过池化后,结果如下:

对所有的feature map执行同样的 *** 作,结果如下:

最大池化(max-pooling)保留了每一小块内的最大值,也就是相当于保留了这一块最佳的匹配结果(因为值越接近1表示匹配越好)。也就是说,它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。
通过加入池化层,图像缩小了,能很大程度上减少计算量,降低机器负载。

常用的激活函数有sigmoid、tanh、relu等等,前两者sigmoid/tanh比较常见于全连接层,后者ReLU常见于卷积层。
回顾一下前面讲的感知机,感知机在接收到各个输入,然后进行求和,再经过激活函数后输出。激活函数的作用是用来加入非线性因素,把卷积层输出结果做非线性映射。

在卷积神经网络中,激活函数一般使用ReLU(The Rectified Linear Unit,修正线性单元),它的特点是收敛快,求梯度简单。计算公式也很简单,max(0,T),即对于输入的负值,输出全为0,对于正值,则原样输出。
下面看一下本案例的ReLU激活函数 *** 作过程:
第一个值,取max(0,077),结果为077,如下图

第二个值,取max(0,-011),结果为0,如下图

以此类推,经过ReLU激活函数后,结果如下:

对所有的feature map执行ReLU激活函数 *** 作,结果如下:

通过将上面所提到的卷积、激活函数、池化组合在一起,就变成下图:

通过加大网络的深度,增加更多的层,就得到了深度神经网络,如下图:

全连接层在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层对结果进行识别分类。
首先将经过卷积、激活函数、池化的深度网络后的结果串起来,如下图所示:

由于神经网络是属于监督学习,在模型训练时,根据训练样本对模型进行训练,从而得到全连接层的权重(如预测字母X的所有连接的权重)

在利用该模型进行结果识别时,根据刚才提到的模型训练得出来的权重,以及经过前面的卷积、激活函数、池化等深度网络计算出来的结果,进行加权求和,得到各个结果的预测值,然后取值最大的作为识别的结果(如下图,最后计算出来字母X的识别值为092,字母O的识别值为051,则结果判定为X)

上述这个过程定义的 *** 作为”全连接层“(Fully connected layers),全连接层也可以有多个,如下图:

将以上所有结果串起来后,就形成了一个“卷积神经网络”(CNN)结构,如下图所示:

综述:卷积神经网络主要由两部分组成,一部分是特征提取(卷积、激活函数、池化),另一部分是分类识别(全连接层),著名的手写文字识别卷积神经网络结构图:

CNN进化历史:
卷积神经网络(CNN)近年来取得了长足的发展,是深度学习中的一颗耀眼明珠。CNN不仅能用来对图像进行分类,还在图像分割(目标检测)任务中有着广泛的应用。CNN已经成为了图像分类的黄金标准,一直在不断的发展和改进。

CNN的起点是神经认知机模型,此时已经出现了卷积结构,经典的LeNet诞生于1998年。然而之后CNN的锋芒开始被SVM等模型盖过。随着ReLU、dropout的提出,以及GPU和大数据带来的历史机遇,CNN在2012年迎来了历史突破:AlexNet。随后几年,CNN呈现爆发式发展,各种CNN模型涌现出来。

CNN的主要演进方向如下:
1、网络结构加深
2、加强卷积功能
3、从分类到检测
4、新增功能模块

下图是CNN几个经典模型(AlexNet、VGG、NIN、GoogLeNet、ResNet)的对比图,可见网络层次越来越深、结构越来越复杂,当然模型效果也是越来越好:

如下:

卷积层:提取特征。“不全连接,参数共享”的特点大大降低了网络参数,保证了网络的稀疏性,防止过拟合。之所以可以“参数共享”,是因为样本存在局部相关的特性。

池化层:有MaxPool和AveragePool等。其中MaxPool应用广泛。因为经过MaxPool可以减小卷积核的尺寸,同时又可以保留相应特征,所以主要用来降维。

全连接层:在全连接的过程中丢失位置信息,可以理解为降低了学习过程中的参数敏感度;很多分类问题需要通过softmax层进行输出;进行非线性变换等等。但是现在已经有很多网络结构去掉了最后的全连接层。我也是入坑没多久,对这一点理解仍很粗浅。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13398727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-28
下一篇 2023-07-28

发表评论

登录后才能评论

评论列表(0条)

保存