//李宏毅视频官网:http://speech.ee.ntu.edu.tw/~tlkagk/courses.html                                                    点击此处返回总目录

//邱锡鹏《神经网络与深度学习》官网:https://nndl.github.io
 

                                                                                

 

我们知道CNN常常用在图像处理上。我们当然可以用一般的神经网络来做图像处理,不一定要用CNN来做。比如说,你要做图像分类,就是训练一个神经网络。它的输入呢,是一张图片。这张图片,你就把它表示成一个很长很长的向量。输出呢,假设有1000分类,那输出就有1000维。

 

                

 

实际上我们训练神经网络的时候,在这个structure里面,每一个神经元就代表了一个最基本的分类器。事实上在文献中,根据训练的结果,有很多人得到这样的结论。举例来说,第一层的神经元,他们是最简单的分类器,它们做的事情就是看看有没有黑色出现,有没有黄色出现,有没有斜的条纹。第二层呢,它做的事情是比第一层更复杂的东西,它根据第一层的output,如果看到直线和横线,就是窗户的一部分;如果看到棕色的条纹,就是木纹;如果看到斜条纹加灰色的,就可能是其他的,比如说轮胎的一部分等等。第三层会做更复杂的事情,某一个神经元看蜂巢,某一个神经元看车子;某一个神经元人等等。【liupc:不知道这个有没有道理。】

           

 

现在的问题是这样:当我们用一般的全连接神经网络,往往需要太多的参数。比如,一张100*100的彩色图片,把它拉成一个向量,有100*100*3(每一张图片有RGB三个值)。输入的图片是3万维,第一层假设有1000个神经元。光第一层的参数就有3万*1000了。这也太多了。

有没有什么方法简化一下网络呢?

                              

CNN做的事情就是简化这个网络的架构。根据我们人对图像处理的理解,我们知道某些weight是用不上的,我们一开始就把这些权重滤掉。我们一开始就想一些办法,不要用全连接神经网络,而是用比较少的参数来做图像处理这件事。

所以CNN其实是比一般的DNN呢,还要更简单的。虽然看起来复杂,但是模型比DNN是要简单的。我们就是用一些knowledge,去把原来全连接网络的一些参数拿掉,就变成CNN。

 

--------------------------------------------------------------------------------------------------------------------------------------

我们先讲一下,为什么我们有可能把一些参数拿掉。为什么我们有可能只有一些比较少的参数,就来做图像处理这件事。

                                                 

我们有几个观察。

第一个是,在图像处理里面,如果我们说第一层的Hidden Layer,那些神经元要做的事情就是,侦测有没有某一种patten出现。大部分的patten是比整张image还要小的。所以对一个神经元来说,假设他想知道一张图片里面有没有某个patten出现,它其实不需要看整张image,它只需要看image的一小部分,它就可以决定这件事情了。

举例还说,我们现在有一种图片,假设第一个hidden Layer的某一个神经元的工作是侦测有没有鸟嘴的存在。它其实并不需要看整张图,因为其实,我们只要给神经元看红色框框的部分,他其实就可以知道是不是一个鸟嘴。

所以,每一个神经元其实只要连接到一个小块的区域就好,它不需要连接到整张完整的图。

                          

 

第二个,观察是,同样的patten,在image里面,它可能出现在image的不同的部分,但是他们代表的是同样的含义。他们可以用同样的神经元,同样的参数就可以侦测出来。

比如,在上图中,有一个在左上角的鸟嘴。在下图中,有一个在中间的鸟嘴。但是并不需要训练两个不同的detector,一个针对左上角的鸟嘴,一个针对中间的鸟嘴。如果这样做的话,就太冗了。所以可以要求这两个神经元用同一组参数。这样就可以减少用的参数的量。【liupc:这个地方画的可能不太对,按照后面的意思,应该画成一张图片上有两个鸟嘴。】

                           

第三个观察是,一个image可以对它做下采样。把一张image的奇数行,偶数列的像素拿掉,变成原来图的十分之一大小,其实不会影响人堆这张image的理解。所以做下采样可能对图像识别这件事是没有什么影响的,我们可以用这个概念把image变小。这样就可以减小需要用的参数。

                            

--------------------------------------------------------------------------------------------------------------------------------------

CNN的架构是这样。输入一张image,首先image会通过一个卷积层,街下来做下采样这件事,再做卷积,再下采样...这个过程可以反复多次(反复的次数要事先决定)。做完多次之后,要做另外一件事情,就是Flatten。做完flatten以后呢,把output丢到一般的全连接网络里面去,然后呢得到图像识别的结果。

                            

刚才讲说,我们基于三个图像处理的观察,设计了CNN这样的网络架构。第一个观察是要侦测一个patten,不需要看整张image,你只要看一个image的一小部分。第二个是,同样的patten,会出现在一张图片的不同区域。第三个是,我们可以做下采样。前面这两个性质使用卷积层来处理;最后这个性质使用下采样来处理。

                             

 

--------------------------------------------------------------------------------------------------------------------------------------

接下来,我们介绍每一个Layer做的事情。

我们先从卷积看起。假设我们的input是一张6*6的image。假设是黑白的,每个像素可以用1个值来描述。比如1代表有涂到墨水,0代表没有涂到墨水。在卷积层里面呢,有一组Filter(待会会将,每一个Filter就等同于是全连接网络里面的一个神经元),每一个Filter是一个矩阵,矩阵里面的元素值就是网络的参数,他们是要根据训练数据学出来的,并不是人去设计的。如果是3*3的size的话,意味着,这个filter是在侦测3*3的patten,它在侦测一个patten的时候,它不看整张image,它只看一个3*3的范围,就可以决定有没有某一个patten的出现,这就是我们考虑的第一个性质。

                        

Filter怎么跟image做操作呢?

Filter是一个3*3的矩阵。把这个录波器放在image的左上角,做内积得到3。然后挪动步长stride(需要自己设),

       

       

       

所以,经过卷积以后,得到一个4*4的矩阵。

 

如果你看这个filter的值,他的斜对角的地方是1,1,1,所以它的工作就是探测有没有连续的1,1,1出现在这个image里面。在image出现在了左上角和左下角两个地方,可以看到卷积之后在左上和左下两个地方出现了最大值。这件事情呢,就考虑了Peoperty2,pattern出现在左上角的位置跟左下角的位置,我们都用filter1就可以侦测出来。不需要用不同的filter来做这件事情。

 

                                         

 

在一个卷积层里面,会有一大堆滤波器,刚才只是一个滤波器的结果。别的filter里面会用不一样的参数。比如,这里有一个滤波器2,它也进行同样的操作,然后得到另外一个4*4的矩阵。红色的4*4的矩阵跟蓝色的4*4的矩阵合起来叫做Feature map。【liupc:存疑。按照后面的意思好像是有几个滤波器,就得到几个Feature map】

有几个滤波器就会得到几个image。比如说有100个滤波器,就会得到100个image。

 

                                    

 

刚才说的是黑白的iamge,如果是彩色的image,会怎么样呢?一个彩色的image是有RGB组成的,所以一个彩色的image就是3个矩阵叠在一起。如果要处理彩色的image,怎么做呢?我们的滤波器就不是一个矩阵了,而是一个立方体。比如,输入的image是3*6*6,滤波器是3*3*3。在做卷积的时候,就是把滤波器的9个值,跟image里面的9个值,做内积。

                                      

--------------------------------------------------------------------------------------------------------------------------------------

 

下面我们讲卷积和全连接有什么关系。你可能会觉得卷积是一个很特别的运算,感觉跟神经网络没有半毛钱关系。其实他就是一个神经网络。怎么说呢?卷积这件事情,其他就是全连接层把一些weight拿掉而已。

                                

怎么说呢?假设我们考虑filter1,跟image的左上角卷积得到3。这件事情等同于把6*6的image拉直成左边这样,然后有一个神经元1的weight只连接到了1,2,3,7,8,9,13,14,15,这个神经元1的output是3,而这9个weight就是Filter1中的9个weight(9个颜色互相对应搞了很久~~)。在全连接神经网络中,一个神经元连接到36个input。但是现在只连接9个input。所以,当我们这样做的时候,就用了比较少的参数。

                      

当我们移动一格,我们得到另外一个值-1。我们假设这是另外一个神经元2的output,神经元2连接到了2,3,4,8,9,10,14,15,16这9个input。还是使用跟神经元1相同的weight。所以,意味着,本来在全连接网络里面,这两个网络都有独立地自己的weight。但是做卷积的时候,首先我们把weight的数目减少了,而且某些神经元共用同一组weight。这件事情叫做权值共享。

 

                             

 

有人可能会问,这要怎么训练。这个一般是用工具做的,如果要自己写的话,做法就跟BP算法一模一样的做法。只是有些weight永远是0。

 

--------------------------------------------------------------------------------------------------------------------------------------

MaxPooling。相对比较简单。使用滤波器1,我们得到4*4的矩阵;使用滤波器2,也得到一个4*4的矩阵。接下来,把矩阵4个一组4个一组。

                                

每一组里面可以选他们的平均或者最大(都可以,就是把原理四个值合成1个值,可以用自己想要的方法来做),这样就可以让image缩小。比如说,我们选最大的保留下来。

                                     

这边可能会有一个问题,就是把这个东西放到网络里面,不就不能微分了么?Max这个东西感觉不能微分。他其实是可以的,我们以后再讲,他其实是有微分的方式来处理的。maxpooling的训练的原理与maxout的训练的原理一样,可以看一下maxout那里的讲解。

 

所以,做完一次卷积和一次下采样以后,就把原来6*6的image变成了一个2*2的image。至于这个2*2的image,他每个像素的深度depends on 你有几个卷积核。有50个卷积核,就有50维;有2个卷积核就有2维。每个卷积核就代表了一个channel。这就是一个新的比较小的image。

                             

--------------------------------------------------------------------------------------------------------------------------------------

Flatten的意思就是把Feature map 拉直。拉直以后,就丢到一个全连接神经网络里面。然后就结束了。

                                    

 

--------------------------------------------------------------------------------------------------------------------------------------

剩下一点时间,讲一下,怎么用

 

 

 

 

 

 

 

 

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐