李宏毅机器学习Task6打卡

CNN 卷积神经网络
常常被用在影像处理上。
当然做影像处理上,也可以用普通的fully connected neural network。但是在训练神经网络时,每一个layer就是一个分类器,需要的参数过于复杂,这样下来需要的计算量过于庞大。

所以CNN就是简化神经网络。虽然CNN看起来比较复杂,但是比一般的DNN还是要简单的。把fully connected layer中的一些参数拿掉,就变成了CNN。

那为什么CNN可以拿掉一些无用的参数呢?
因为一些pattern是比一整张图片要小的,所以你要识别这个pattern的时候,并不需要输入一整张图片,而是输入一部分就可以。比如下面这张鸟的图片,你要判断是否存在鸟嘴,只需要“鸟嘴”这一小部分的图片就可以,不需要输入整张图片。
image

而且,同样的pattern也可能出现在image不同的部分,比如“鸟嘴”,有可能在图片的左上角,也可能在中间。所以如果输入整张图片的话,那么不仅需要“左上角鸟嘴的识别器”,还要有”中间鸟嘴的识别器“,十分冗杂。
既然两张图片都是寻找”鸟嘴“,那么位置是不重要的,这里就需要它们能够分享彼此的参数,用一个相同的detector来识别。这样就可以减少需要的参数的量。
image

而且,我们可以对图片进行subsampling重采样,比如去掉奇数行偶数列的数据并不会影响人类对一张图片的判断。所以用重采样令图片变小,这样就可以减少我们需要的参数。
image

所以整个CNN的架构大致如下图所示:
image
对一张图片进行convolution 和Max pooling操作,Convolution和Max pooling可以重复很多次,之后进行flatten操作,并将结果放入fully connected feedforward network中,进行影像识别。

总结一下,设计CNN架构就是基于下面这三个点:

  1. 要甄别一个pattern不需要看整张图片,只需要一小部分就可以
  2. 同样的pattern可能会出现在图片的不同区域
  3. 适当的重采样不会改变对影像的判读结果
    image

那么,什么是convolution呢?
假设我们的图片时左边的66的图片,而在convolution layer里面也有一组33的filter(每一个filter就是一个matrix, filter里面的参数,就是network的参数(和权重和bias一样),它们是必须学出来的,并不是人为设计的)。每一个filter是33就意味着它在侦测一个33的pattern。
image

将filter作为窗口,放在6*6图片的左上角,并求内积,然后开始移动并依次计算内积。
image

最终得到一个4*4的数组,如下(stride为步长,就是每次移动的长度,是一格还是两格,或更多):
image

而这个filter的作用就是判断在图像中有没有出现和filter相同情况的栅格值,以此例子来说,就是左上角和左下角分别出现了和filter相同的情况。所以计算出来的新的矩阵的左上角和左下角的值为3.
image

在一个convolution layer中有很多filter,每个filter都会产生一个新的4*4的矩阵,如下图:
image
新产生的矩阵(红色和蓝色)合起来就叫做feature map。

如果上面的image是彩色的RGB,那么filter也同样会变成3层,如下图:
image
注意,并不是每一个图层分开算,而是合在一起算的。

这个convolution就是把fully connected layer中的一些weight拿掉而已。
image
就是说每次输入的input就是考虑了filter中框住的部分。这样就能够输入较少的参数来进行计算了。
image
这样子一方面减少了输入,另一方要确定每次filter移动后的input都共用同一组weight,这样子的话呢输入的weight也比原来的更少。

Max pooling
根据filter卷积,能得到很多新的matrix,如下图:
image
然后每四个为一组,去他们的最大值,得到结果如下:
image

这样子做完了一次convolution和一次max pooling,我们就把原来66的input,简化成了现在22的input。新的matrix的深度就是filter的个数。
image
这个convolution和max pooling 可以重复很多次。

Flatten
Flatten就是把生成的矩阵拉直,并丢入一个fully connected feedforward network里:
image

CNN in Keras
CNN的输入需要考虑深度,需要输入一个3维的vector。
image

  1. Convolution 2D(25,3,3)的意思是,有25个filter,filter的尺寸是3*3
  2. Input_shape(1,28,28)的意思是,黑白图(如果是RGB那就是3,28,28),尺寸是28*28
  3. Maxpooling2D(2,2)的意思是,以2*2为一组取最大值

在进行convolution和max pooling的时候,尺寸会发生改变,得到的结果通过flatten输入到fully connected feedforward network中去:
image

下面是详细讲解CNN:
image
假设上图的左下角是第N个filter。
还需要定义一个值Degree of the activation of the k-th filter,代表这个activation和第K个filter有多相近。就是里面所有的元素求和。
找到一个输入X,使得我们定义的activation最大。可以用gradient descent或者gradient ascent实现。

之前是有了输入,去求参数,现在是倒过来,有了filter,去求一个输入X。
以上面的例子,前12个filter求得X图像如下:
image
这些image都是小小的纹理的重复。
所以这也就证明了其实每一个filter,都是在监测某一种pattern,某一种线条。

考虑flatten之后,在neural network里怎么工作呢?
image
得到左下角这样的图作为输入,放入neural network中,可以使的neural的输出的activation最大

可以看到现在的图已经不是一个个简单的纹路了。
那是因为之前只考虑filter,filter只检测某一种纹路。而现在考虑了flatten之后,不就再是只看某一个filter了,而是看一整张图。所以现在每个neural的输入输出都是一个完整的图像。

如果现在考虑输出呢?
image
可以看到数字识别0,1,2….这样最佳输出是如上图这样的。所以机器学到的东西和人类看到的东西还是有点不同的。

那么如何让这些图更像我们的数字呢?
我们需要对X做一些限制。
image
我们把那些pixel的值加起来,但是还希望输出的减去它们的值越大越好,也就是希望x的总和越小越好。
得到的结果就如右边所示了。这样就已经可以隐隐约约看出来数字的轮廓了。

Deep dream
Deep dream的思想就是,给机器一张图片,它们自动加上自己看到的东西。
image

当把上图输入到CNN里面去的时候,再将某一个hidden layer的filter的值改变一下,就能得到下面的情况:
image
这就是会夸大化自己所看到的东西,让本来检测出来的东西更像检测出来的事物。

Deep dream 的进阶版本是deep style。
就是让一张图有另一张图的风格。如下图:
image

image

这是怎么实现的呢?
将两张图丢入CNN中,得到里面的内容和风格,然后训练一个CNN让其输出的图片内容想原来的图像,风格像另一个图片,如下图:
image

CNN 还可以让机器学会下围棋。
当然fully-connected feedforward network也可以实现这样的情况。但是CNN的结果会更好。

只要把棋盘和棋子作为一个19*19的matrix作为输入就可以。
因为围棋和图像处理也有相似的情况:
围棋也要考虑小的pattern,而且pattern也会出现在棋盘的不同的地方。
image

同样,CNN也可以被应用于声音的处理上:
可以把音频表示为一个spectrogram。
下图的横轴是图片,纵轴是频率:
image
通过看这些图片,就可以辨识里面的内容。
在处理时,我们一般只考虑在频率上移动的filter。因为CNN会考虑不同地方出现的pattern,比如男生和女生说相同的内容,但是频率也是不同的,但频率的趋势是相同的。所以在频率上上下移动是可以监测出来的。

而且CNN也可以被用于文字处理上:
image
将文字作为一个vector,然后把一整个句子的文字连起来的vector就会变成一张图片。这样就可以套用到CNN中。注意的是设计CNN时应考虑我们只会在句子的方向移动filter。

浙ICP备19012682号