关于对CNN(卷积神经网络)的总结

平时做自然语言处理的时候,都会有用到CNN的模型,可是对于模型本身的算法具体过程还没有完全理解透彻!
因此阅读了一些文章书籍以及观看了一些课程,在这里尽量以通俗易懂的语言,以问答形式作一个总结,如有错误的地方劳烦指出!

一 CNN是个什么鬼?它可以用来做什么?
CNN的英文全称是Convolutional Neural Networks(可不是那个美国有线电视新闻网CNN哦), 中文名叫作卷积神经网络,是神经网络的一种,它非常适合用于图像处理的问题。举个简单的小例子,你有10000张人脸照片,有男有女,每张照片标记男或者女,那么可以通过‘输入照片——CNN模型——输出标记’来训练一个识别男女的分类模型,训练完毕后,输入任意一张人脸照片,模型就可以预测出这张照片的性别啦!当然,还有更多复杂的应用,比如识别图像中的物体,看图说话等,另外,在文字处理方面,有些任务也可以用到CNN。

二 你知道CNN的灵感来源是什么吗?
说到CNN的灵感来源,这就要牵涉到人类大脑的视觉原理了。

之前上学的时候记得老师问过一个这样的问题:一个天然瞎的盲人有一天突然有了正常视力了,你觉得他/她看到的世界应该是什么样子的?嘿嘿,你是不是从来都没想过这个问题呢?一般来说啊,这个人可以看到东西,但是并不能认知东西。比如说,我们正常人看到一辆车渐行渐远,而此人看到的是一个东西一点点变小了,也就是说,视觉是一个需要学习并且层层加工的过程,而不是简单的‘看到什么’。又比如,我们经常看到大人这样逗婴儿,躲起来,又现身,通常婴儿会很惊讶,然后咯咯大笑。对于婴儿来说,他/她的感觉就是一个人突然消失了,还没有一个东西把另一个东西遮蔽起来,虽然看不到但是还存在的概念。所以呢,一言以蔽之,看到并不等于看见!

好,言归正传,人类的大脑是怎么样识别我们所看到的东西的呢?简单地说,我们的大脑有很多不同的区域或者说不同的脑细胞,分别负责不同层次的任务。举个例子,我们看到了埃及金字塔,这个时候,脑子里的细胞开始活动了,细胞A说:哈,这是一些不同方向的直线!细胞B听了之后,说:小弟,你错了,这是一些三角形!细胞C听闻后说:此言差矣,这是个三角体啊!细胞D在一旁摇摇头,说道:小兄弟们,你们都错啦,这就是埃及的金字塔啊!也就是说,我们的大脑从最细微的特征开始,层层递进,得到愈来愈抽像的概念。

而CNN正是模仿这一过程,先抓取一些局部的具体信息,然后再加工,再再加工,最后得到了一个抽象的概念。

三 那CNN具体是怎么操作的呢?
CNN主要包含两个操作,一个是卷积操作,一个是池化操作。

先说说卷积,简而言之,就是用一个个滤波器,去抓取图像中的特征。还是举个例子,我们有一张黑白图片,上而写了很多个白色的‘一’, 那么怎么识别这些个‘一’的位置呢?
我们先把图像数字化,可以把黑的像素点写成0,白的像素点写成1,如下所示:
00000011110
00111100000
00000011110
00011110000
我们再设置一个滤波器(在实际应用中滤波器一般为正方形):
1111
然后我们把这个滤波器当作一个移动窗口,逐行逐列地取图像中的四个数字分别作相乘运算并相加,那么可以想见,在1多的地方,我们得到的结果肯定大,0多的地方,结果肯定小,如此我们就可以把‘一’给找出来啦!

在实际的模型搭建中,我们只需要在框架里设置一些变量,滤波器的大小,个数,步长,扩充边缘的值。在编写代码的时候,最好注释一下经过滤波器前后图像的大小以方便后续的操作。比如,原图像的大小为(255,255,3), 卷积核大小为3,共有10个, 步长为1, 不扩充边缘,那经过这一层滤波器(卷积)操作之后,图像的大小为多少?
图像大小变为(253,253,10)
在具体操作中:图像尺寸为(W,W,H),步长为S,滤波器为(N,N,M),pad的值为P,则图像尺寸变为: ((W+2*P-N)/S+1,(W+2*P-N)/S+1,M)。注意,扩充的时候是左右、上下对称的,比如卷积核的大小为5*5,那么pad设置为2,则四个边缘都扩充2个像素。
顺便提一句,卷积层的训练参数个数为:(卷积核的大小+偏置项)*该层卷积核的个数。例如上述例子中,每个的尺寸为3*3*3, 那么根据公式,参数个数为(3*3*3+1)*10 = 280

再来说说池化操作,别听这个称呼这么高大上,其实意思很简单,就是根据一群数字取一个有代表性的数,一般来说我们取这些数的平均数,也可以取最大值,一般我们会取最大值。这个操作是为了压缩图片,减少之后的计算量。为啥可以这么做呢?其实从图像的角度来理解很简单,把一张图像素稍稍变低一些,我们还是可以分辨出这张照片里有些什么。
池化层的后的图像尺寸变化计算方式和卷积层一样。一般池化层选取池化核的尺寸为2,步长为2, 池化之后图像大小变为原来的一半。另外注意池化层里没有需要训练的参数个数。

经过多个卷积+池化的操作,将结果展开(即经过一层Flatten层),就可以连上全连接输出需要的结果啦。

四 CNN网络怎么用于自然语言处理呢?
我们知道,在文字处理中,一般都是把词转化为词向量的,那对于词向量,做卷积干啥呢?还是举个例子,假设有一句话“我爱土豆”,三个词的词向量分别是:
我 [0.4, 0.5, 0.1]
爱 [0.3, 0.3, 0.4]
土豆 [0.1, 0.8, 0.1]
我们把这句话拼接起来变成一个矩阵,然后开始做卷积处理。仔细想想,如果这里用一个大小为(2,2)的滤波器,也就是说,我们对某两个词的其中两个维度做卷积,那这样就丢失了第三维的信息,而对于词向量为说,一个向量代表了一个单词的意义。所以如果我们会取(2,3)的滤波器,就显得更有意义些,这样一来,我们抓取了’我爱‘,’爱土豆‘这两个信息了,这其实有点类似N-gram的思想,抓取一些短语的信息。

五 能总结下CNN适合处理什么样的问题吗?
根据CNN的特性,我们可以认为CNN适合处理特征层层关联,层层递进,特征从具体到抽像的问题。比如,在图像中,简单的线条形成几何形状,形状组合再变成一些小部件,小部件组合又变成一个物体。又比如,在一句话中,词组成词组,词组组成短语,短语再组成句子。

六 在搭建CNN模型的实践过程中,需要注意哪些问题?
根据经验,笔者认为需注意的问题有:
注意与实际任务相结合,比如图像和文字的处理,对于卷积的形式就不一样。不要一上来就堆模型。
注意每一层之间的输入输出大小。很多时候代码出bug是因为对每一层输入输出的大小不清楚,没有对上一层的输出做变换以适应下一层的输入格式。另外,每个深度学习的框架里设置的参数形式也不一样,需要具体地参考官方说明书。

猜你喜欢

转载自blog.csdn.net/weixin_42936560/article/details/81570736