首页 > 技术文章 > CNN(卷积神经网络)

code-fun 2020-11-07 22:52 原文

参考:https://blog.csdn.net/m0_37490039/article/details/79378143

DNN

DNN(全连接深度神经网络),每个神经元都与相邻层的神经元连接。
DNN在训练后能够正确地分类,那肯定是它在训练中学到了东西,学到什么东西呢?它学到了图片中的某些空间结构(特征),不同数字它们的空间结构肯定是不一样的,而这样的空间结构就是由像素点与像素点之间的关系形成。我们再仔细看DNN输入层和第一个隐藏层,发现它对我们输入的像素点是同等对待的,也就是说它此时并没有考虑像素点与像素点之间的关系。有没有一个好点的模型能够考虑到这点呢?那就是CNN

盗盗图1

CNN

CNN有三个几本思想,局部感受野(local receptive fields) 权值共享(shared weights) 池化(pooling)

局部感受野

局部感受野,它像一个架在输入层上的窗口。你可以认为某一个隐藏层的神经元学习分析了它”视野范围“(局部感受野)里的特征。移动这样一个窗口使它能够扫描整张图,每次移动它都会有一个不同的节点与之对应(学到不同的特征)。通过滑动,形成了第一个隐藏层。
这里我们的窗口滑动了一个像素,通常说成一步(stride),也可以滑动多步,这里的stride也是一个超参,训练是可以根据效果调整,同样,窗口大小也是一个超参。

权值共享

这里假设窗口为55

σ代表的是激活函数,如sigmoid函数等,b就是偏移值,w就是5
5个共享权值矩阵,我们用矩阵a表示输入层的神经元,ax,y表示第x+1行第y+1列那个神经元(注意,这里的下标默认都是从0开始计的,a0,0表示第一行第一列那个神经元)所以通过矩阵w线性mapping后再加上偏移值就得到公式中括号里的式子,表示的是隐藏层中第j+1行k+1列那个神经元的输入。

a1表示隐藏层的输出,a0表示隐藏层的输入,而∗就表示卷积操作(convolution operation) 这也正是卷积神经网络名字的由来。
由于权值共享,窗口移来移去还是同一个窗口,也就意味着第一个隐藏层所有的神经元从输入层探测(detect)到的是同一种特征(feature),只是从输入层的不同位置探测到(图片的中间,左上角,右下角等等),必须强调下,一个窗口只能学到一种特征!这里我个人的理解是窗口在这个位置学到的权值可能再下个位置被更新,但是这个权值更新会参考这个位置的学到的权值,宏观上看只有一个特征(权值),但是这个特征又是综合了窗口的所有移动成果。
另外,窗口还有其他叫法:卷积核(kernal),过滤器(filter)。我们在做图像识别时光学习一个特征肯定是不够的,我们想要学习更多的特征,就需要更多的窗口。如果用三个窗口的话如下图

窗口与窗口间的w和b是不共享的,三个窗口就表示有三个w矩阵和三个偏移值b,结果是从整张图片的各个位置学到三种不同的特征。
权值共享还有一个很大的好处,就是可以大大减少模型参数的个数。直觉上我们可以感受到,CNN可以依靠更少的参数来获得和DNN相同的效果,更少的参数就意味着更快的训练速度。

池化

池化层通常接在卷积层后面。池化这个词听着就很有学问,其实引入它的目的就是为了简化卷积层的输出。通俗地理解,池化层也在卷积层上架了一个窗口,但这个窗口比卷积层的窗口简单许多,不需要w,b这些参数,它只是对窗口范围内的神经元做简单的操作,如求和,求最大值,把求得的值作为池化层神经元的输入(出?)值
由于经过了卷积操作,模型从输入层学到的特征反映在卷积层上,max-pooling做的事就是去检测这个特征是否在窗口覆盖范围的区域内。这也导致了,它会丢失这种特征所在的精准位置信息,所幸的是池化层可以保留相对位置信息。而后者相比而言比前者更重要。
池化层一个最大的好处:经过池化后,大大减少了我们学到的特征值,也就大大减少了后面网络层的参数(上图可以看出池化层的神经元数明显少于卷积层神经元数)。

总的来看


从左往右依次是输入层,卷积层,池化层,输出层。输入层到卷积层,卷积层到池化层已经详细介绍过了。池化层到输出层是全连接,这和DNN是一样的。
整体上把我CNN的网络架构,其实和DNN很相似,都是一层一层组合起来的,层与层之间的行为也是有对应的权值w和偏移值b决定的,并且它们的目的也是一致的:通过training data来学习网络结构中的w和b,从而能把输入的图片正确分类。

其他理解

在NLP中,也是类似的,卷积意味着对对句子中邻近的词向量进行过滤,抽取某种隐含语义的特征,而池化意味着对这些隐含语义的进一步压缩抽象,使之变成更加通用的语义特征。

推荐阅读