cnn本质

cnn的核心在于卷积核,其实关于卷积核还有另一个名字叫做滤波器,从信号处理的角度而言,滤波器是对信号做频率筛选,这里主要是空间-频率的转换,cnn的训练就是找到最好的滤波器使得滤波后的信号更容易分类,还可以从模版匹配的角度看卷积,每个卷积核都可以看成一个特征模版,训练就是为了找到最适合分类的特征模版,一点浅见。

 

-----------------------------------分割线--------------------------------------------

 

 

 

深度学习 (deep learning) 将数据的表示分级, 高级的表示建立在低级的表示上, 机器将从数据简单的表示中学习复杂的表示. 比如第一层我们从图像的像素和邻近像素的像素值中识别边缘, 第二层将边缘整合起来识别轮廓和角点, 第三层提取特定的轮廓和角点作为输入的特征, 最后通过一个线性分类器识别图像中的目标. 这样的一种解决问题的策略称为连接主义 (connectionism). 虽然每一层都是相对简单的运算, 但是多层结合起来会展示出模型强大的力量.

综上, CNN最强大的能力是它的表示学习能力, 它能自动的从数据的原始像素中学到合适的表示. 在有的应用中, 人们就把一个 CNN 当做一个特征提取器来使用, 通过 CNN 提取到合适的表示之后再用 SVM 之类的算法进行进一步的计算.

-----------------------------------分割线--------------------------------------------

 

我感觉 CNN 的卷积层就是一个基于滤波器的图像处理器。图像处理领域使用一些人们预先定义好的滤波器起到模糊图像、识别边缘等操作。CNN 就是把滤波器也纳入学习过程,把它们当作可训练的参数。这样在 CNN 的靠近输入图像的那部分(卷积层)就可以认为训练出来了一些滤波器,这些滤波器滤出来的图像再送往网络后端——一个类似传统神经网络的分类器

 

至于那些训练出来的滤波器是起什么作用的,那就有点黑盒的意思了。常见的滤波器:高通、低通、高斯模糊、SOBEL 查找边缘 ... 这些,是白盒。是人有目的设计出来的。CNN 卷积层的那些滤波器则是根据训练样本拟合出来的。用这些训练得到的滤波器去滤一滤图像看看,也许能看出其中一些滤波器的"目的"。

 

-----------------------------------分割线--------------------------------------------

 

 

从卷积运算上来说一下我的理解吧。一般的,卷积神经网络的卷积运算是使用一个k*k的矩阵,对图像对应的像素做乘法,然后加和。例如对于一张图片(下面图像来自楼上的回答,懒得在找了)

 

使用卷积核

做卷积的话,可以得到

这可以看出来,如果把卷积核和图像中对应区域都拉成一个向量的话,卷积运算其实就是向量的内积运算。内积是衡量两个向量之间的相似性的,所以卷积核在图像某一区域的卷积实际上就是这个卷积核与图像该区域的相似性。因此,

  1. 一个卷积核探索一种相似性,多个卷积核探索多个相似性。
  2. 卷积核作用在不同的样本上,探索输入数据的局部相关性,即不同样本数据都有这样的局部特征。这是因为,如果一个kernel与A相似又与B相似,那么自然A与B相似,如果A和B是不同的样本,那么kernel 探索的是样本数据共有的局部特征。
  3. 卷积核作用在同一样本的不同位置上(即卷积核在整张图上共享(权值共享)),如果A和B是同一张图上的不同位置,那么kernel探索的就是不同位置共有的局部特征,或者说,局部特征的平移不变性。

-----------------------------------分割线--------------------------------------------

 

 


按照我的理解,CNN的核心其实就是卷积核的作用,只要明白了这个问题,其余的就都是数学坑了(当然,相比较而言之后的数学坑更难)。

如果学过数字图像处理,对于卷积核的作用应该不陌生,比如你做一个最简单的方向滤波器,那就是一个二维卷积核,这个核其实就是一个模板,利用这个模板再通过卷积计算的定义就可以计算出一幅新的图像,新的图像会把这个卷积核所体现的特征突出显示出来。比如这个卷积核可以侦测水平纹理,那卷积出来的图就是原图水平纹理的图像。

现在假设要做一个图像的分类问题,比如辨别一个图像里是否有一只猫,我们可以先判断是否有猫的头,猫的尾巴,猫的身子等等,如果这些特征都具备,那么我就判定这应该是一只猫(如果用心的话你就会发现这就是CNN最后的分类层,这一部分是我们传统的神经网络的范畴)。关键在于这些特征是高级的语义特征,这种特征怎么用卷积核提取呢?

原来的卷积核都是人工事先定义好的,是经过算法设计人员精心设计的,他们发现这样或那样的设计卷积核通过卷积运算可以突出一个什么样的特征,于是就高高兴兴的拿去卷积了。但是现在我们所需要的这种特征太高级了,而且随任务的不同而不同,人工设计这样的卷积核非常困难。

于是,利用机器学习的思想,我们可以让他自己去学习出卷积核来!也就是学习出特征!

如前所述,判断是否是一只猫,只有一个特征不够,比如仅仅有猫头是不足的,因此需要多个高级语义特征的组合,所以应该需要多个卷积核,这就是为什么需要学习多个卷积核的原因。

还有一个问题,那就是为什么CNN要设计这么多层呢?首先,应该要明白,猫的头是一个特征,但是对于充斥着像素点的图像来说,用几个卷积核直接判断存在一个猫头的还是太困难,怎么办?简单,把猫头也作为一个识别目标,比如猫头应该具有更底层的一些语义特征,比如应该有猫的眼睛、猫的耳朵、猫的鼻子等等。这些特征有的还是太高级了,没关系,继续向下寻找低级特征,一直到最低级的像素点,这样就构成了多层的神经网络。

最好,CNN最不好理解的就要放大招了。虽然我们之前一直用一些我们人常见的语义特征做例子,但是实际上CNN会学习出猫头、猫尾巴、猫身然后经判定这是猫吗?显然我们的CNN完全不知道什么叫猫头、猫尾巴,也就是说,CNN不知道什么是猫头猫尾巴,它学习到的只是一种抽象特征,甚至可能有些特征在现实世界并没有对应的名词,但是这些特征组合在一起计算机就会判定这是一只猫!关于这一点,确实有些难以理解,比如一个人判断猫是看看有没有猫头、猫身子、猫尾巴,但是另一个选取的特征就是有没有猫的毛,猫的爪子,还有的人更加奇怪,他会去通过这张图像里是不是有老鼠去判断,而我们的CNN,则是用它自己学习到的特征去判断。

———————————分割线——————————————————————

最近又看了一些资料,在此纠正和阐明一些问题。

目前CNN的可视化是一个很火的方向了,有些论文中已经提到了中间的卷积层特征其实也是具有现实的语义意义的,但是只是不那么清晰。

CNN称之为深度学习,要义就在这个深字上,对于CNN而言,这个深其实就是意味着层层的特征表示。比如浅层的特征,例如点、线、面之类的简单几何形状,都是在底层训练出来的,对于这些底层的特征继续进行组合表示,就是后面的若干层的任务。最后把从低级特征组合而来的高级特征在进一步变成语义特征,就可以使用全连接层进行分类了。也就是说,最后一次分类并不一定要用神经网络,如果已经拿到了足够好的特征信息,使用其余的分类器也未尝不可。

这就是为什么CNN可以fine-tune的原因,例如你要完成一个分类猫和狗的任务,你需要从头训练一个CNN网络吗?假设你的猫狗图片样本量并不是很大,这并不是一个好主意。好的办法是,拿一个经过大型图像数据集,你如ImageNet,训练过的大规模CNN(比如VGG NET)直接载入训练,这个过程称之为fine-tuning。因为这个CNN底层已经训练到了丰富的细节信息,你所需要训练的其实是上层对这些特征的组合信息,以及最后全连接层的分类信息,所以完全不需要从头再来。这也证明了CNN确实可以有迁移学习的能力。

———————————分割线——————————————————————

之前有一点没有说,今天没啥事补充一下,也算是做个记录。

CNN的部件其实大致分为三个,卷积层、池化层、全连接层,这也是LeNet-5的经典结构,之后大部分CNN网络其实都是在这三个基本部件上做各种组合和改进。卷积层之前已经介绍过了,全连接层就是连在最后的分类器,是一个普通的bp网络,实际上如果训练得到的特征足够好,这里也可以选择其他的分类器,比如SVM等。

那么池化层是干什么的呢?池化,英文是pooling,字面上看挺难懂,但其实这可能是CNN里最简单的一步了。我们可以不按字面理解,把它理解成下采样(subsampling)。池化分为最大值池化和平均值池化,和卷积差不多,也是取一小块区域,比如一个5*5的方块,如果是最大值池化,那就选这25个像素点最大的那个输出,如果是平均值池化,就把25个像素点取平均输出。

这样做有什么好处呢?1、应该很明显可以看出,图像经过了下采样尺寸缩小了,按上面的例子,原来5*5的一个区域,现在只要一个值就表示出来了!2、增强了旋转不变性,池化操作可以看做是一种强制性的模糊策略,举个不恰当的例子,假设一个猫的图片,猫的耳朵应该处于左上5*5的一个小区域内(实际上猫的耳朵不可能这么小),无论这个耳朵如何旋转,经过池化之后结果都是近似的,因为就是这一块取平均和取最大对旋转并不care。

当然和之前的卷积一样,池化也是层层递进的,底层的池化是在模糊底层特征,如线条等,高层的池化模糊了高级语义特征,如猫耳朵。所以,一般的CNN架构都是三明治一样,卷积池化交替出现,保证提取特征的同时也强制模糊增加特征的旋转不变性。

更新一下比较advantage的东西。

现代CNN相比于之前的远古CNN发生了很大变化,虽然这里的远古CNN大约在2014年论文中出现,距今也只有不到4年时间。这里也可以看出深度学习的发展日新月异,一日千里的可怕速度。

理解了本身CNN的基础含义,再来看看这些先进的CNN,是很有必要的,不要指望只靠卷积层池化层就可以得到好的效果,后来加入CNN的trick不计其数,而且也都是里程碑式的成果。下面主要以图像分类的CNN来阐述。

暴力加深流派:以AlexNet和VGGNet为首的模型,这一派观点很直接,就是不断交替使用卷积层池化层,暴力增加网络层数,最后接一下全连接层分类。这类模型在CNN早期是主流,特点是参数量大,尤其是后面的全连接层,几乎占了一般参数量。而且相比于后续的模型,效果也较差。因此这类模型后续慢慢销声匿迹了。

Inception流派:谷歌流派,这一派最早起源于NIN,称之为网络中的网络,后被谷歌发展成Inception模型(这个单词真的不好翻译。。。)。这个模型的特点是增加模型的宽度,使得模型不仅仅越长越高,还越长越胖。也就是说每一层不再用单一的卷积核卷积,而是用多个尺度的卷积核试试。显然,如果你熟悉CNN,就不难发现,这样做会使每一层的feature map数量猛增,因为一种卷积核就能卷出一系列的feature map,何况多个!这里google使用了1*1的卷积核专门用来降channel。谷歌的特点是一个模型不玩到烂绝不算完,所以又发展出了Inception v2、Inception v3、Inception v4等等。

残差流派:2015年ResNet横空出世,开创了残差网络。使用残差直连边跨层连接,居然得到了意想不到的好效果。最重要的是,这一改进几乎彻底突破了层数的瓶颈,1000层的resnet不是梦!之后,最新的DenseNet丧心病狂地在各个层中间都引入了残差连接。目前大部分模型都在尝试引入残差连接。

注意,到此为止,大部分模型已经丢弃了全连接层,改为全局平均池化。大大降低了参数量。

混合流派:这一派不说了,就是看到哪几类模型效果好,就把这类技术混杂起来。典型的就是Xception和ResIception,将Inception和残差网络结合起来了。

BatchNromalization:不得不提这个批量标准化技术,在此技术出现之前,CNN收敛很慢,此技术出现后,大大加快了模型收敛速度,还兼具一定的防过拟合效果。当然,这个技术不仅仅限于CNN。

 

-----------------------------------分割线--------------------------------------------

 

 

1*1卷积的作用

下图是Inception的结构,尽管也有不同的版本,但是其动机都是一样的:消除尺寸对于识别结果的影响,一次性使用多个不同filter size来抓取多个范围不同的概念,并让网络自己选择需要的特征。

你也一定注意到了蓝色的1x1卷积,撇开它,先看左边的这个结构。

输入(可以是被卷积完的长方体输出作为该层的输入)进来后,通常我们可以选择直接使用像素信息(1x1卷积)传递到下一层,可以选择3x3卷积,可以选择5x5卷积,还可以选择max pooling的方式downsample刚被卷积后的feature maps。

但在实际的网络设计中,究竟该如何选择需要大量的实验和经验的。Inception就不用我们来选择,而是将4个选项给神经网络,让网络自己去选择最合适的解决方案。

接下来我们再看右边的这个结构,多了很多蓝色的1x1卷积。这些1x1卷积的作用是为了让网络根据需要能够更灵活的控制数据的depth的。

1x1卷积核

如果卷积的输出输入都只是一个平面,那么1x1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系。

但卷积的输出输入是长方体,所以1x1卷积实际上是对每个像素点,在不同的channels上进行线性组合(信息整合),且保留了图片的原有平面结构,调控depth,从而完成升维或降维的功能。

如下图所示,如果选择2个filters的1x1卷积层,那么数据就从原本的depth 3 降到了2。若用4个filters,则起到了升维的作用。

这就是为什么上面Inception的4个选择中都混合一个1x1卷积,如右侧所展示的那样。其中,绿色的1x1卷积本身就1x1卷积,所以不需要再用另一个1x1卷积。

而max pooling用来去掉卷积得到的Feature Map中的冗余信息,所以出现在1x1卷积之前,紧随刚被卷积后的feature maps。(由于没做过实验,不清楚调换顺序会有什么影响。)

 

-----------------------------------分割线--------------------------------------------

 

 

1*1的卷积核与Inception

 

本文介绍1*1的卷积核与googlenet里面的Inception。正式介绍之前,首先回顾卷积网络的基本概念。
1. 卷积核:可以看作对某个局部的加权求和;它是对应局部感知,它的原理是在观察某个物体时我们既不能观察每个像素也不能一次观察整体,而是先从局部开始认识,这就对应了卷积。卷积核的大小一般有1x1,3x3和5x5的尺寸。卷积核的个数就对应输出的通道数,这里需要说明的是对于输入的每个通道,输出每个通道上的卷积核是不一样的。比如输入是28x28x192(WxDxK,K代表通道数),然后在3x3的卷积核,卷积通道数为128,那么卷积的参数有3x3x192x128,其中前两个对应的每个卷积里面的参数,后两个对应的卷积总的个数。
2. 池化(pooling):卷积特征往往对应某个局部的特征。要得到globa的特征需要将全局的特征就行一个aggregation。池化就是这样一个操作,对于每个卷积通道,将更大尺寸(甚至是globa)上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling当然就对应了cross region。与1x1的卷积相对应,后者可以看作一个cross channel的pooling操作。pooling的另外一个作用就是升维或者降维,后面我们可以看到1x1的卷积也有相似的作用。

下面从一般卷积过程介绍1x1的卷积,借用[1]中的图来表示卷积的过程:

对于nxn(n>1)的卷积核,我们通常还要考虑pad(边缘补0的个数),stride(每次卷积移动的步长)。但是当尺寸是1x1时,对于single channel而言就相当于对原特征的scala操作;但是我们一般遇到的都是multi-channel的情况,此时我们便可以根据自己的需要定义卷积核的个数,从而进行降(升)维。如上面所说,如果将它看作cross channel的pooling 操作,它还能帮我们得到在同一位置不同通道之间进行特征的aggregation。
总结一下,1x1的卷积核可以进行降维或者升维,也就是通过控制卷积核(通道数)实现,这个可以帮助减少模型参数,也可以对不同特征进行尺寸的归一化;同时也可以用于不同channel上特征的融合。一个trick就是在降维的时候考虑结合传统的降维方式,如PCA的特征向量实现,这样效果也可以得到保证。
以googlenet[3]中的inception模块为例,来说明1x1的卷积如何来减少模型参数。

左边是naive的inception模块,右边是加入1x1 convolution进行降维的inception。按照上面的说法,我们的这层的模型参数与输入的特征维数(28x28x192),卷积核大小以及卷积通道数(包括三种卷积核,分别是1x1x64,3x3x128,5x5x32),右图中在3x3,5x5 convolution前新加入的1x1的卷积核为96和16通道的,在max pooling后加入的1x1卷积为32通道。那么图a该层的参数为(1x1x192x64)+(3x3x192x128)+(5x5x192x32)
图b该层的参数为(1x1x192x64)+(1x1x192x96)+(1x1x192x16)+(3x3x96x128)+(5x5x16x32)+(1x1x192x32).
比较可知,模型参数减少了。
reference
[1]http://blog.csdn.net/stdcoutzyx/article/details/41596663
[2]http://www.caffecn.cn/?/question/136
[3]going deeper with convolutions

 

 

-----------------------------------分割线--------------------------------------------

 

 

 

从最基础的开始

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

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

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

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

其处理效果如下:

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

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

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

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

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

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

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

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

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

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

卷积神经网络的第一个卷积层的滤波器用来检测低阶特征,比如边、角、曲线等。随着卷积层的增加,对应滤波器检测的特征就更加复杂(理性情况下,也是我们想要的情况)。比如第二个卷积层的输入实际上是第一层的输出(滤波器激活图),这一层的滤波器便是用来检测低价特征的组合等情况(半圆、四边形等),如此累积,以检测越来越复杂的特征。实际上,我们的人类大脑的视觉信息处理也遵循这样的低阶特征到高阶特征的模式(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 的变化收敛的。这也就是说很可能达到了我们训练这个神经网络的目的——让各个卷积层的滤波器能够组合起来最优化的检测特定的模式

 

 

 

-----------------------------------分割线--------------------------------------------

 

 

 

其实我们在做线性回归也好,分类(逻辑斯蒂回归)也好,本质上来讲,就是把数据进行映射,要么映射到一个多个离散的标签上,或者是连续的空间里面,一般简单的数据而言,我们很好拟合,只要线性变化一下,然后学习出最好的W就可以了,但是对于一些比较复杂的数据怎么办呢?比如说,对于一个二分类问题,特别是高纬度复杂化之后,数据不一定是线性可分的,这个时候,我们的basis function隆重登场,我们可以把数据进行一定的映射,转变,非线性的线性的,转变之后,就可以进行分类,最明显的例子在andrew NG在讲SVM里面的例子就很好的说明了,但是这个时候问题来了,对于一个很复杂,高维度的数据,我们如何才能找到最好的basis function呢?这个时候,神经网络隆重登场,我们把我们的basis function打开来,我们把误差转递到basis function的里面,通过这样的方式,来得到最好的basis function,同理,我们可以无限打开basis function,一直打开,对应的也就是一层神经网络(具体出自于prml关于神经网络的章节最开始简介的部分),但是问题来了,对于图片怎么办?我们知道,对于图片而言,图片是一个二维度的数据,我们怎样才能通过学习图片正确的模式来对于一张图片有正确的对于图片分类呢?这个时候,有人就提出了一个观点,我们可以这样,对于所有的像素,全部都连接上一个权值,我们也分很多层,然后最后进行分类,这样也可以,但是对于一张图片来说,像素点太多,参数太多了。然后就有人提出来,我们只看一部分怎么样,就是对于一张图片来说,我们只看一个小窗口就可以了,对于其他的地方,我们也提供类似的小窗口,我们知道,当我们对图片进行卷积的时候,我们可以对图片进行很多操作,比如说图片整体模糊,或者是边缘的提取,卷积操作对于图片来说可以很好的提取到特征,而且通过BP误差的传播,我们可以根据不同任务,得到对于这个任务最好的一个参数,学习出相对于这个任务的最好的卷积核,之所以权值共享的逻辑是:如果说一个卷积核在图片的一小块儿区域可以得到很好的特征,那么在其他的地方,也可以得到很好的特征。

这就有了alex net的提出,通过对图片进行五层(不知道有没有记忆错误)的卷积,然后后面三层的全连接,我们可以得到一个很好的结果,特别的相对于更大的数据集而言,最好参数越多越好,也就是网络最好更加深,更加的宽。

但是神经网络到底是什么?对于一批数据我们有很多的问题,为什么设置五层最好,batchsize多少比较好,每一层多少个卷积核(这个到现在我依旧没有一个更好的解释,每一个应该多少卷积核),宽度多少?要不要LRN?每一层都代表了什么?

这些的解释,就要好好看看今年CVPR的文章Visualizing and Understanding Convolutional Networks 这篇文章写的很棒,而且2015 CVPR出了很多对于卷积神经网络理解的文章,这篇文章提出了一个反卷积的方法(De-convolution)的方法,这样我们就可以好好看看每一层卷积神经网络到底做了什么事情:

首先第一层的返卷积(上面是反卷积的图片,下面对于第一层来说,激活值最大的图片):

我们看到,第一个卷积层只是表达了简单的图片的边缘而已,我们来看第二层:

第二层稍稍复杂了一点点,可以包含的不仅仅是一个边缘,可以是几个边缘的组合

第三层:

第四层:

第五层:

我们看到,每一层都是对于一张图片从最基础的边缘,不断到最复杂的图片自己本身。

同时在进行反卷积的时候M.D. Zeiler and R. Fergus也发现,对于第一层的alexnet,会得到频度很高的像素(也就是颜色很深),所以他们也提出了应该要减小窗口,这样可以得到频度比较适中的像素

当图片卷积完之后,会把一个图片对于这一类本身最独特的部分凸显出来,然后来进行判断,这一类到底是什么?有下面的实验截图:

最左边的图像是原图像,作者盖住不同的区域,来分析对于一张图片,经过五次卷积之后,到底是如何判断的,我们看到卷积到最后(左三),比较凸显出来的是狗的头部,左二和右二的意思是,当我们遮住不同的区域,判断是狗的几率,红色区域代表概率很高,蓝色区域代表概率很低,我们发现,当我们遮挡住狗的头的地方的时候,我们得到这个物体时狗的概率最低,这个侧面证明了,所谓卷积神经网络,就是会自动的对于一张图片学习出最好的卷积核以及这些卷积核的组合方式,也就是对于一张图片的任务来说,求出最好的图片对于本任务的特征的表达,然后来进行判断

还有一篇文章也助于理解,

UnderstandingDeepImageRepresentationsbyInvertingThem

这篇对于卷积每一层都不断的还原到最原始的图片:

越是到后面,图片越模糊,但是它自己独特的部分,却凸显了出来。(也就是这个猩猩还是狒狒的头的部分)

还望指正,多谢

反正我写的也没什么人看,随意干啥都行,标明作者就好了。

 

 

-----------------------------------分割线--------------------------------------------

 

 

 

引言

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

 

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

 

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

 

今天,我将与你共享我的心得,展示我如何上手卷积神经网络并最终弄明白了它。我将做一个通盘的展示,从而使你对 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 中的输出层是全连接层,其中来自其他层的输入在这里被平化和发送,以便将输出转换为网络所需的参数。
  • 随后输出层会产生输出,这些信息会互相比较排除错误。损失函数是全连接输出层计算的均方根损失。随后我们会计算梯度错误。
  • 错误会进行反向传播,以不断改进过滤器(权重)和偏差值。
  • 一个训练周期由单次正向和反向传递完成

 

 

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
天文数据挖掘是指通过运用数据挖掘技术来分析和发现天文学领域中的模式、趋势和规律。CNN(卷积神经网络)是一种机器学习算法,在天文数据挖掘中也有广泛应用。 天文学是一个数据密集的领域,通过观测和测量天体的位置、亮度、光谱和其他特征,可以获得大量的天文数据。这些数据可能是结构化的,如天体的坐标、亮度等,也可能是非结构化的,如图像和光谱。通过应用CNN算法,可以有效地从这些数据中挖掘出有价值的信息。 首先,CNN可以用于天体分类。通过将天体图像输入CNN模型中进行训练,可以使模型学习到天体的特征表示,识别出不同类型的天体,如恒星、星系或类星体等。这有助于天文学家更好地理解宇宙中不同类型的天体分布和演化。 其次,CNN还可用于天体异常检测。通过对天体亮度、光谱等数据进行建模,可以训练CNN模型来捕捉天文事件中的异常模式。这些异常可能是超新星爆发、行星凌日或其他天文现象,通过及时发现和分析这些异常模式,可以推进天文学的研究进程。 此外,CNN还可以用于天体图像处理。天文学家通过望远镜观测到的图像往往受到噪声、模糊和其他干扰的影响,这可能导致对天体的观测结果不准确。通过应用CNN算法,可以对天体图像进行去噪、修复和增强,提高天文观测的质量和精度,进而改善天文研究的结果。 综上所述,天文数据挖掘中的CNN算法是一个强大的工具,它能够从天文数据中挖掘出有价值的信息,并在天文学研究中发挥重要作用。通过使用CNN,我们可以更好地理解宇宙的本质、演化和特征。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值