【深度学习 理论】Convolutional Neural Network

目录

0.Instruction 

1.Convolution

2.Max Pooling

3.Flatten

4.CNN in Keras

5.What does CNN learn?

    (1)Filter做什么?

    (2)neuron做什么?

    (3)CNN输出是什么?


0.Instruction 

CNN是处理图像的的network。

做图像处理,常规的Fully connected network也可以做。但是会有特别多的参数(例如:100*100的iamge,使用每层1000个neuron的network,就会有1千万个参数)。

A neuron does not have to see the whole image to discover the pattern.

Some patterns are much smaller than the whole image。Connecting to small region with less parameters

We can subsample the pixels to make image smaller, Less parameters for the network to process the image.

Subsampling the pixels will not change the object bird.

CNN通过多次“Convolution + Max Pooling”对图像进行压缩,最后将得到的矩阵按行展开作为Fully Connected Feedforward network的一层的neuron。

1.Convolution

Filterimage的子矩阵内积。

设stride=1,再计算Filter和image子矩阵的内积:

然后依次计算所有的内积,得到一个矩阵:

如果Filter有多个,再做上述过程的计算,同样得到一个矩阵,这些矩阵合起来就叫做“Feature Map”。

如果是黑白图片就是上面的情形,如果是彩色照片,用RBG表示的,image就是一个立体的矩阵,而Filter也是立体的。计算方法和平面矩阵一样。

Convolution和Fully Connected有什么关系?

其实,Convolution就是一个Fully Connected。

Convolution是Fully Connected把一些weight拿掉而已。我们假设Feature Map是Fully Connected的一个hidden layer的output(原矩阵展开下x1~x36经过filter的计算得到feature map)。

2.Max Pooling

把output分组,可以选每组中最大的那个留下,然后得到一个新的小的矩阵。

     

那这样,经过一次Convolution和Max Pooling之后,就得到了一个output矩阵。

例如下图,一个6*6image经计算得到一个2*2的image,至于2*2的image的深度,取决于Filter的个数。

可以多次重复这个过程,得到更小的image。

现在,我们思考一个问题,假设第一次计算有5个filter,我们会得到一个5层的feature map;如果第二次计算我们仍有5个filter,那么第二次计算产生的结果是几层的feature map?是5层,还是5*5=25层?

答案是5层。因为在convolution的时候,是考虑所有的层次的,而不是只考虑一层。

3.Flatten

将Feature Map拉直(逐层、按行展开),把它丢到一个Fully Connected Feedforward network中,作为其一层的neuron。

4.CNN in Keras

5.What does CNN learn?

CNN到底学到了什么?大家常说deep learning是一个黑盒子,learn出来以后,根本不知道为什么是这样的,但是还是可以有很多方法去分析CNN到底学到了什么。

(1)Filter做什么? 

第一层:detect的东西很容易知道,检测的都是比较直观的特性。

第二层:第二个convolution layer里面的50个filter,每一个filter的output就是一个矩阵(11*11)。

如果把第k个filter的output拿出来,定义一个"Degree of the activation of the k-th filter",指现在的input跟第k个filter有多match。这时候如果输入一张图片X,可以通过gradient ascent(求max)。这个matrix里的每一个element,用上标k表示是第k个filter,下标 i  j 则表示它在这个matrix里的第i行,第j列。如下:

接下来定义一个ak叫做Degree of the activation of the k-th filter,这个指标是现在的第k个fukter,它有多倍activate,有多被启动,换句话说就是现在input的东西跟第k个filter有多接近,它对filter的激活程度有多少?

第K个filter被启动的degree a'k就定义成,它与input进行卷积后输出的output里面所有element的sum,就是这11*11的output martix里所有元素之和。也就是说,input一张image,然后把这个filter和image进行卷积所output的11*11个值全部加起来,当作这个filter被activate的程度。

因此,我们就要找一张image,这张image可以让第k个filter被启动的程度最大;于是要解决的就是,找一个image x,它可以让我们定义的activation的degree a‘k最大,即:
在这里插入图片描述

之前我们求minimize用的是gradient descent,现在就用maximum,用gradient ascent(梯度上升)去完成

*以前是input固定,调model的参数,现在是model的参数固定,调input,找这个图片X。看起来像是条纹一样的东西。

50个filter理论上可以分别找50张image使对应的activation最大,这里仅挑选12张image展示,这些image有一个共同的特征,它们里面都是一些反复出现的某种纹路,比如第3张image有小条纹,这意味这第三个filter的工作就是看图上是否有斜条纹。而途中一旦出现小小的斜条纹,这个filter就会被activate,相应的output也会比较大,而斜条纹越多,activation的程度就越大,output也越大.。

因此每个filter的工作就是去detect某一种pattern。

(2)neuron做什么?

先定义第j个neuron的output就是aj,接下来用gradient ascent的方法去找一张image x,并把它丢到neural network里面就可以让a’j的值被maximize,即:
在这里插入图片描述
得到的结果如下图,这9张图跟之前的filter所观察到的很不一样,刚才我们观察到的类似纹路的东西,那是因为每个filter考虑的知识图上一部分的vision,所以它detect的是一种纹路;而在做完Flatten后,每一个neuron不再是只看整张图的一小部分,而是看整张图,所以对每一个neuron来说,让她最activation的不再是纹路,而是一张完整的图形。

(3)CNN输出是什么?

由于是手写识别的demo,因此这里的output就是10维,先将某一维拿出来,然后同样去找一张image x,使这个维度的output值最大,即
可以想象一下,现在么一个output的每一个dimension就对应到一个数字,那如果去找一张image x,它可以让对应到数字1的那个output layer的neuron的output值最那,那这张image显然应该看起来像是数字1,但是输出的结果却如下图:

但是我们发现,让数字1对应的neuron的output值最大的image其实一点也不像”1“,但是将上述的得到的image作为testing data丢到CNN里面,结果值确实认为这些image就对应着数字0-8。因此,neural network所学到的东西跟人类的一般认知是不一样的。

那如何让上面的图看起来更像是数字呢?

我们可以对这个x做一些regularization,也就是对找出来的x做一些限制。假设image里的每一个pixel都用xij表示,把所有pixel值取绝对值并求和,这一项其实就是之前提到的L1的regularization,再用yi减去该项,得到:
在这里插入图片描述
这次我们希望再找一个input x,它可以让yi最大的同时也要让绝对值的summation越小越好,也就是说,我们希望找出的image,大部分地方是没有涂色的,只有少数笔画部分才有颜色。

猜你喜欢

转载自blog.csdn.net/Aibiabcheng/article/details/108114884