卷积神经网络(CNN)算是深度神经网的前身了,在手写数字识别上在90年代初就已经达到了商用的程度。先明确一点就是,Deep Learning是全部深度学习算法的总称,CNN是深度学习算法在图像处理领域的一个应用。
一、简介
现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。
在图像处理中,往往把图像表示为像素的向量,比如一个1000×1000的图像,可以表示为一个1000000的向量。在上一节中提到的神经网络中,如果隐含层数目与输入层一样,即也是1000000时,那么输入层到隐含层的参数数据为1000000×1000000=10^12,这样就太多了,基本没法训练。所以必先减少参数加快速度。下面几种方法来改善:
1、局部感知。
2、权值共享。
3、池化。
1、局部感知
一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息:
如上图所示,左图是全连接,右图是部分连接,假如每个神经元只和10×10个像素值相连,那么权值数据为1000000×100个参数,减少为原来的千分之一。而那10×10个像素值对应的10×10个参数,其实就相当于卷积操作的核。每个卷积核按照一定步长作用在整幅图像上后就产生一副新的图像,注意:一个神经单元就只作用在一个10*10的像素块,所以多个神经元所有的卷积结果共同构成一副新的图像。
2、权值共享
不是局部连接的神经元权值相同,而是同一平面层的神经元权值相同,也就是说每个神经元用的是同一个卷积核去卷积图像。有相同程度的位移、旋转不变性。这样的话参数就减少到10*10=100个了,我们可以这100个参数(也就是卷积操作)看成是提取特征的方式,但一种卷积核就代表一种特征。可以提取多种特征,那就用多种卷积核,就产生多幅图像,这样的话,每层就有有多个二维平面组成,每个平面由多个独立神经元组成,每个神经元只作用于输入图像的一个局部像素块。每种卷积核去卷积图像就得到对图像的不同特征的放映,我们称之为Feature Map。
那么隐层的神经元个数怎么确定呢?它和原图像,也就是输入图像的大小(神经元个数)、卷积核的大小和卷积核在图像中的滑动步长都有关,例如,我的图像是1000x1000像素,而滤波器大小是10x10,假设滤波器没有重叠,也就是步长为10,这样隐层的神经元个数就是(1000x1000 )/ (10x10)=100x100个神经元了。注意,这只是一种卷积核,也就是一个Feature Map的神经元个数。
3、池化
即池化,即下采样,目的是减小特征图,池化规模一般为2×2。常用的池化方法有:
最大池化(Max Pooling)。取2*2=4个点的最大值。这是最常用的池化方法。
均值池化(Mean Pooling)。取4个点的均值。
4、ImageNet-2010网络结构
下图即为Alex的CNN结构图。需要注意的是,该模型采用了2-GPU并行结构,即第1、2、下图即为Alex的CNN结构图。需要注意的是,该模型采用了2-GPU并行结构,即第1、2、并行与模型并行。数据并行是指在不同的GPU上,模型结构相同,但将训练数据进行切分,分别训练得到不同的模型,然后再将模型进行融合。而模型并行则是,将若干层的模型参数进行切分,不同的GPU上使用相同的数据进行训练,得到的结果直接连接作为下一层的输入。
输入:224×224大小的图片,3通道
第一层卷积:5×5大小的卷积核96个,每个GPU上48个。
第一层max-pooling:2×2的核。
第二层卷积:3×3卷积核256个,每个GPU上128个。
第二层max-pooling:2×2的核。
第三层卷积:与上一层是全连接,3*3的卷积核384个。分到两个GPU上个192个。
第四层卷积:3×3的卷积核384个,两个GPU各192个。该层与上一层连接没有经过pooling层。
第五层卷积:3×3的卷积核256个,两个GPU上个128个。
第五层max-pooling:2×2的核。
第一层全连接:4096维,将第五层max-pooling的输出连接成为一个一维向量,作为该层的输入。
第二层全连接:4096维
Softmax层:输出为1000,输出的每一维都是图片属于该类别的概率。
参考资料:
http://www.36dsj.com/archives/24006
http://blog.csdn.net/zouxy09/article/details/8781543/
http://blog.csdn.net/celerychen2009/article/details/8973218