写在前面
报了一个组队打卡活动,现在已经到了任务6,今天是学习卷积神经网络,之前也是听过,但没有好好学习,正好趁这个机会,好好学习下。
参考视频:https://www.bilibili.com/video/av59538266
参考笔记: https://github.com/datawhalechina/leeml-notes
为什么用CNN?
CNN一般都用在影像处理上,当然也可以用一般的neural network做影像处理,不一定要使用CNN。
但是这样处理的话,会使得hidden layer 参数过多,而CNN做的事情就是简化neural network的架构。
CNN架构
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,然后得到影像辨识的结果
Convolution(卷积)
Propetry1:
如下,假设我们的network的input是一张6*6的Image,其中1表示有涂墨水,0表示没有涂墨水。那在convolution layer里面,它由一组的filter,(其中每一个filter其实就等同于是fully connect layer里面的一个neuron),每一个filter其实就是一个matrix(3 *3),这每个filter里面的参数(matrix里面每一个element值)就是network的parameter(这些parameter是要学习出来的,并不是需要人去设计的)
如果filter是33的,就意味着需要侦察一个33的pattern,在侦察的时候只看3*3范围内就可以确定有没有某一个pattern的出现。
第一个filter是一个3*3的matrix,先从image左上角进行运算,计算image的9个值和filter的9个值得内积,这个结果为3,之后再stride移动(这个自己设计),我们先设stride为1. 最终得到如下结果(图形右边)
经过这件事情以后,本来是6 *6的matrix,经过convolution process就得到4 *4的matrix。如果你看filter的值,斜对角的值是1,1,1。所以它的工作就是detain1有没有1,1,1(连续左上到右下的出现在这个image里面)。比如说:出现在这里(如图所示蓝色的直线),所以这个filter就会告诉你:左上跟左下出现最大的值
在一个convolution layer 里面会有很多的filter(刚才只是一个filter的结果),那另外的filter会有不同的参数(图中显示的filter2),它也做跟filter1一模一样的事情,在filter放到左上角再内积得到结果-1,依次类推。把filter2跟 input image做完convolution之后,你就得到了另一个4*4的matrix,红色4 *4的matrix跟蓝色的matrix合起来就叫做feature map,看你有几个filter,你就得到多少个image(你有100个filter,你就得到100个4 *4的image)
如果对于彩色的Image,也是类似的,彩色图片是由RGB组成的。所以,一张Image就是好几个matrix叠在一起。
convolution和fully connected之间的关系
convolution就是fully connected layer把一些weight拿掉了。经过convolution的output其实就是一个hidden layer的neural的output。如果把这两个link在一起的话,convolution就是fully connected拿掉一些weight的结果。
在fully connected中,一个neural应该是连接在所有的input(有36个pixel当做input,这个neuron应连接在36个input上),但是现在只连接了9个input(detain一个pattern,不需要看整张image,看9个input就好),这样做就是用了比较少的参数了。
将stride=1(移动一格)做内积得到另外一个值-1,假设这个-1是另外一个neural的output,这个neural连接到input的(2,3,4,8,9,10,14,15,16),同样的weight代表同样的颜色。在9个matrix。
当我们做这件事情就意味说:这两个neuron本来就在fully connect里面这两个neural本来是有自己的weight,当我们在做convolution时,首先把每一个neural连接的wight减少,强迫这两个neural共用一个weight。这件事就叫做shared weight,当我们做这件事情的时候,我们用的这个参数就比原来的更少。
Max pooling
相对于convolution来说,Max Pooling是比较简单的。我们根据filter 1得到4*4的maxtrix,根据filter2得到另一个4 *4的matrix,接下来把output ,4个一组。每一组里面可以选择它们的平均或者选最大的都可以,就是把四个value合成一个value。这个可以让你的image缩小。
做完一个convolution和一次max pooling,就将原来6 * 6的image变成了一个2 *2的image。这个2 *2的pixel的深度depend你有几个filter(你有50个filter你就有50维),得到结果就是一个new image but smaller,一个filter就代表了一个channel。
这个操作可以repeat很多次,通过一个convolution + max pooling 就得到一个新的image,它是一个比较小的image,然而,可以通过重复做convolution + max pooling,将其得到一个更小的image。
Flatten
flatten就是feature map拉直,拉直之后就可以丢到fully connected feedforward netwwork,然后就结束了。
后面就是关于CNN的实操了,下次再补充。