首页 > 代码库 > 浅谈卷积神经网络及matlab实现
浅谈卷积神经网络及matlab实现
前言,好久不见,大家有没有想我啊。哈哈。今天我们来随便说说卷积神经网络。
1卷积神经网络的优点
卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积,从图像像素中提取图像特征,这种处理方式更加接近人类大脑视觉系统的处理方式。另外,卷积神经网络的权值共享属性和pooling层使网络需要训练的参数大大减小,简化了网络模型,提高了训练的效率。
2 卷积神经网络的架构
卷积神经网络与原始神经网络有什么区别呢,现在我分别给他们的架构图。
图 1 普通深度神经网络
图 2 卷积神经网络
哇,大家看,有什么特别的,是不是在输出层与卷积层之间有一个C/S的什么乱七八糟的的东西。其实这个就是卷积神经网络的精髓所在,他的优点不就是可以直接学习像素点,类似于人的眼睛采集信息吗。
输入层:卷积输入层可以直接作用于原始输入数据,对于输入是图像来说,输入数据是图像的像素值。
卷积层:卷积神经网络的卷积层,也叫做特征提取层,包括二个部分。第一部分是真正的卷积层,主要作用是提取输入数据特征。每一个不同的卷积核提取输入数据的特征都不相同,卷积层的卷积核数量越多,就能提取越多输入数据的特征。
第二部分是pooling层,也叫下采样层,主要目的是在保留有用信息的基础上减少数据处理量,加快训练网络的速度。通常情况下,卷积神经网络至少包含二层卷积层(这里把真正的卷积层和下采样层统称为卷积层),即卷积层,pooling层,卷积层,pooling层。卷积层数越多,在前一层卷积层基础上能够提取更加抽象的特征。
全连接层:可以包含多个全连接层,实际上就是多层感知机的隐含层部分。通常情况下后面层的神经节点都和前一层的每一个神经节点连接,同一层的神经元节点之间是没有连接的。每一层的神经元节点分别通过连接线上的权值进行前向传播,加权组合得到下一层神经元节点的输入。
输出层:输出层神经节点的数目是根据具体应用任务来设定的。如果是分类任务,卷积神经网络输出层通常是一个分类器。
3卷积计算
卷积核类似于人眼对物体进行扫描,所以自然很重要了。其中有离散型卷积核连续性卷积。
连续型卷积:
离散型卷积:
再神经网络中的卷积操作都属于离散卷积,其实际上是一个线性运算,而不是真正意义上的卷积操作,相应的卷积核也可以称为滤波器。卷积核大小确定了图像中参与运算子区域的大小。说白了,卷积核上的参数可以当成权重,就是说,现在每个像素点,对最后的卷积结果的投票能力,权值越大,投票能力也就越大。
3.1 卷积运算和相关运算的区别
例子如下,matlab输入运算:
得到结果:
卷积运算:
得到结果:
从中可以看出,卷积计算其实就是相关计算翻转180°,为什么要这样呢。
相关计算公式:
相关顾名思义就是计算,两个变量之间的相关关系,而卷积则是某个信号对整个系统所产生的影响。
两者相同点是:都是将两个函数映射到一个函数的函数 (f,g)->h。过程也很类似,卷积 是在先将一个函数反转以后进行 滑动相关。
不同点:
1、卷积是对称的 conv(f,g)=conv(g,f)。而滑动相关不对称,ccorr(f,g)~=ccorr(g,f)。
2、卷积是两个系统作用时的响应,(由于对称性,谁作用于谁并不本质)。
滑动相关是衡量两个函数相似度,与相对位置之间的关系。
3、信号处理上卷积可以进行局部操作(就是滤波),例如图像的高斯模糊。系统响应分析。
滑动相关一般用来进行特征检测,比如图像特征提取
3.2 卷积过程
上述图表示,卷积过程,首先输入原始图像,然后用f(x)这个卷积核进行卷积,在加一个偏置,然后用激活函数进行非线性映射,得到初步的卷积结果,现在激活函数一般都用relu,sigmoid用的都比较少了。
3.3下采样过程
既然图像经过卷积之后我们是不是就要用分类器进行分类了呢,显然是不行的,你想一个图像辣么大,网络的训练速度一定会很慢的吧,过拟合肯定也不用说了。那么我们的前辈想到的肯定是降维啊,但是这里我们不叫降维,而是叫下采样,当然降维是我理解的,也不知道准确与否。
下采样就是利用图像的静态性。对相邻的地方进行聚合统计,打个比方就是你额头的地方肯定和你额头的地方很像吧,耳朵也和你耳朵很像吧。
另外,图像的下采样具有不变性。如果下采样区域为特征映射的连续区域,那么得到的下采样单元具有平移不变性,比如图像经过一个小的平移处理后,同样会得到相同的(下采样)特征。在实际应用中,比如物体检测,声音识别等应用中,都希望系统具有平移不变性的特征,因为具有平移不变特征后,即使样本经过平移处理后,标记依然能够被系统识别。
综上所述,下采样的主要作用是:
1、降低图像分辨率;(我理解就是,分辨率越高反而不利于分类,肯定过拟合啊)
2、减少运算数据量;
3、增强网络对图像变化的适应性。
3.4局部连接和权值共享
局部连接与全局连接:
大家看,假设我们爱因斯坦图片是1000x1000像素的图片,那就是一百万的像素点,输入的维度也是一百万,在连接一个相同大小的隐藏层,那么就是一万亿个连接,那还训练个毛线啊,所以我们必须减少权重的数量。
插播一段小广告,来自于百度回答。
上述的回答说白了,就是猫猫的视觉神经中,每一个感受野只接受一小块的区域的信号,对其他东西是不感冒的。那么是不是就启发我们的卷积神经网络了?
局部连接就是根绝上述思想而来的。每一个神经元不需要接收全部像素点的信息,只需要接收局部的像素点进行输入。然后在把所有信息综合起来,那么就可以得到全局信息了。假设感受野大小是10x10,那么是不是就只需要10x10x100=1亿个连接了?
但是呢一亿个好像还是有点大,现在假设我们每个隐藏节点的神经元参数都是一样的,那么参数就只有100个参数,也就是每一个过程就只有10x10那一百个参数。这样整个模型的复杂度就降下来了。(其实我这里一直认为,给每个神经元适当的权重还是不错的,毕竟有的特征(像素)肯定对分类效果影响比较大吧)
这样我们的卷积神经网络特征就构建完毕了。卷积核越多就可以构建更多的高阶特征。
高阶特征类似于这样,这也符合人类看物体的习惯,因为在人的视网膜里物体无非都是边边线线的组合,这些高阶特征经过组合就编程了物体的大致形状。完全不合小样本的概念:比如一个鼠标你只要看过这样的:
那么下次你在见过这样的,你一定知道他是鼠标,无论他多么绚丽,因为在你的脑海里,已经有诸多的高阶特征构成了鼠标,所以分类效果当然very good。
我可没有打广告哦....
4 光说不练假把式,光练不说傻把式。
我们现在来看一下具体的实验效果吧。
以上是测试MNIST手写体的实验,直接输入图片,识别率是88.7%,当然不太高,这是参数没有调好的缘故。
我的卷积神经网络matlab实现代码主要来自:https://github.com/rasmusbergpalm/DeepLearnToolbox
5 总结
今天只是简单介绍了一下卷积神经网络的知识点,等下一章节,我们在介绍目前为止世界上最先进的卷积神经网络改进,大家不见不散哦。
浅谈卷积神经网络及matlab实现