李宏毅-P5卷积神经网络
卷积神经网络
为什么用CNN?
在training neural network时,我们会期待说:在network的structure里面,每一个neural就是代表了一个最基本的classifier,事实在文件上根据训练的结果,你有可能会得到很多这样的结论。举例来说:第一层的neural是最简单的classifier,它做的事情就是detain有没有绿色出现,有没有黄色出现,有没有斜的条纹。第二个layer是做比这个更复杂的东西,根据第一个layer的output,它看到直线横线就是窗框的一部分,看到棕色纹就是木纹,看到斜条纹+灰色可能是很多的东西(轮胎的一部分等等)再根据第二个hidden layer的outpost,第三个hidden layer会做更加复杂的事情。
但现在的问题是这样的,当我们一般直接用fully connect feedforward network来做影像处理的时候,往往我们会需要太多的参数,举例来说,假设这是一张100 100的彩色图(一张很小的imgage),你把这个拉成一个vector,(它有多少个pixel),它有100 100 3的pixel。如果是彩色图的话,每个pixel需要三个value来描述它,就是30000维(30000 dimension),那input vector假如是30000dimension,那这个hidden layer假设是1000个neural,那么这个hidden layer的参数就是有30000 *1000,那这样就太多了。那么CNN做的事就是简化neural network的架构。我们把这里面一些根据人的知识,我们根据我们对影像就知道,某些weight用不上的,我们一开始就把它滤掉。
总之,CNN就是用比较少的参数来进行影像处理。所以CNN比一般的DNN还要简单的。
1·Small region 一些图片的patterns会比整张图小很多
我们说第一层的 hidden layer那些neural要做的事就是侦测某一种pattern,有没有某一种patter出现。大部分的pattern其实要比整张的image还要小,对一个neural来说,假设它要知道一个image里面有没有某一个pattern出现,它其实是不需要看整张image,它只要看image的一小部分。
举例来说,假设我们现在有一张图片,第一个hidden layer的某一种neural的工作就是要侦测有没有鸟嘴的存在(有一些neural侦测有没有爪子的存在,有没有一些neural侦测有没有翅膀的存在,有没有尾巴的存在,合起来就可以侦测图片中某一只鸟)。假设有一个neural的工作是要侦测有没有鸟嘴的存在,那并不需要看整张图,其实我们只需要给neural看着一小红色方框的区域(鸟嘴),它其实就可以知道说,它是不是一个鸟嘴。对人来说也是一样,看这一小块区域这是鸟嘴,不需要去看整张图才知道这件事情。所以,每一个neural连接到每一个小块的区域就好了,不需要连接到整张完整的图。
2·Same Patterns
同样的pattern在image里面,可能会出现在image不同的部分,但是代表的是同样的含义,它们有同样的形状,可以用同样的neural,同样的参数就可以把pattern侦测出来。
3·Subsampling
我们知道一个image你可以做subsampling,你把一个image的奇数行,偶数列的pixel拿掉,变成原来十分之一的大小,它其实不会影响人对这张image的理解。对你来说:这张image跟这张image看起来可能没有太大的差别。是没有太大的影响的,所以我们就可以用这样的概念把image变小,这样就可以减少你需要的参数。
CNN架构
首先input一张image以后,这张image会通过convolution layer,接下里做max pooling这件事,然后在做convolution,再做max pooling这件事。这个process可以反复无数次,反复的次数你觉得够多之后,(但是反复多少次你是要事先决定的,它就是network的架构(就像你的neural有几层一样),你要做几层的convolution,做几层的Max Pooling,你再定neural架构的时候,你要事先决定好)。你做完决定要做的convolution和Max Pooling以后,你要做另外一件事,这件事情叫做flatten,再把flatten的output丢到一般fully connected feedforward network,然后得到影像辨识的结果。
前面的两个property可以用convolution来处理掉,最后的property可以用Max Pooling这件事来处理。
(1)Convolution
Propetry1
假设现在我们的network的input是一张66的Image,如果是黑白的,一个pixel就只需要用一个value去描述它,1就代表有涂墨水,0就代表没有涂到墨水。那在convolution layer里面,它由一组的filter,(其中每一个filter其实就等同于是fully connect layer里面的一个neuron),每一个filter其实就是一个matrix(3 3),这每个filter里面的参数(matrix里面每一个element值)就是network的parameter(这些parameter是要学习出来的,并不是需要人去设计的)
每个filter如果是3 3的detects意味着它就是再侦测一个3 3的pattern(看3 3的一个范围)。在侦测pattern的时候不看整张image,只看一个3 3的范围内就可以决定有没有某一个pattern的出现。这个就是我们考虑的第一个Property。
Propetry2
filter跟image运作。首先第一个filter是一个3* 3的matrix,把这个filter放在image的左上角,把filter的9个值和image的9个值做内积,两边都是1,1,1(斜对角),内积的结果就得到3。(移动多少是事先决定的),移动的距离叫做stride(stride等于多少,自己来设计),内积等于-1。stride等于2,内积等于-3。我们先设stride等于1。
你把filter往右移动一格得到-1,再往右移一格得到-3,再往右移动一格得到-1。接下里往下移动一格,得到-3。以此类推(每次都移动一格),直到你把filter移到右下角的时候,得到-1(得到的值如图所示)
经过这件事情以后,本来是6 6的matrix,经过convolution process就得到4 4的matrix。如果你看filter的值,斜对角的值是1,1,1。所以它的工作就是detain1有没有1,1,1(连续左上到右下的出现在这个image里面)。比如说:出现在这里(如图所示蓝色的直线),所以这个filter就会告诉你:左上跟左下出现最大的值
就代表说这个filter要侦测的pattern,出现在这张image的左上角和左下角,这件事情就考虑了propetry2。同一个pattern出现在了左上角的位置跟左下角的位置,我们就可以用filter 1侦测出来,并不需要不同的filter来做这件事。
在一个convolution layer 里面会有很多的filter(刚才只是一个filter的结果),那另外的filter会有不同的参数(图中显示的filter2),它也做跟filter1一模一样的事情,在filter放到左上角再内积得到结果-1,依次类推。你把filter2跟 input image做完convolution之后,你就得到了另一个44的matrix,红色4 4的matrix跟蓝色的matrix合起来就叫做feature map,看你有几个filter,你就得到多少个image(你有100个filter,你就得到100个4 *4的image)
刚才举的例子是一张黑白的image,所以input是一个matrix。若今天换成彩色的image,彩色的image是由RGB组成的,所以,一个彩色的image就是好几个matrix叠在一起,就是一个立方体。如果要处理彩色image,这时候filter不是一个matrix,filter而是一个立方体。如果今天是RGB表示一个pixel的话,那input就是36 6,那filter就是3 3 3。
在做convolution的话,就是将filter的9个值和image的9个值做内积(不是把每一个channel分开来算,而是合在一起来算,一个filter就考虑了不同颜色所代表的channel)
未完待续…













