cnn - juedaiyuer/researchNote GitHub Wiki

卷积神经网络 CNN

(Convolutional Neural Network)CNN

配置和使用theano,cuda-convnet,cuda-convnet2

CNN是深度学习算法在图像处理领域的一个应用

大家应该知道大名鼎鼎的傅里叶变换,即一个波形,可以有不同的正弦函数和余弦函数进行叠加完成,卷积神经网络也是一样,可以认为一张图片是由各种不同特征的图片叠加而成的,所以它的作用是用来提取特定的特征

1. 简介

20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(Convolutional Neural Networks-简称CNN)

模式分类领域,该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,应用广泛

2. 全连接

dl/cnn/1365562155_9356.jpg

在图像处理中,往往把图像表示为像素的向量,比如一个1000×1000的图像,可以表示为一个1000000的向量。在上一节中提到的神经网络中,如果隐层数目与输入层一样,即也是1000000时,那么输入层到隐含层的参数数据为1000000×1000000=10^12,这样就太多了,基本没法训练。所以图像处理要想练成神经网络大法,必先减少参数加快速度。减少参数的方法如下:

减少参数

  • 降低计算的复杂度
  • 过多的连接会导致严重的过拟合,减少连接数可以提升模型的泛化性

3. 局部感知

图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。这样,我们就可以减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。如上图右:假如局部感受野是10x10,隐层每个感受野只需要和这10x10的局部图像相连接,所以1百万个隐层神经元就只有一亿个连接,即10^8个参数,其实就相当于卷积操作。比原来减少了四个0(数量级),这样训练起来就没那么费力了,但还是感觉很多的啊,那还有啥办法没?

这里都假设隐层神经元数量=图片像素数量

4. 参数共享

上面的操作虽然减少了参数,但是参数仍是过多,于是启动了CNN的第二级神器-权值共享

在上面的局部连接中,每个神经元都对应100个参数,一共1000000(1000×1000)个神经元,如果这1000000个神经元的100个参数都是相等的,那么参数数目就变为100了。

隐含的原理则是:图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。

如下图所示,展示了一个33的卷积核在55的图像上做卷积的过程。每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来

dl/cnn/cnn.gif

黄色部分矩阵就是我们的过滤器,用来提取特征(滤波器或者卷积核),让卷积核在输入矩阵进行从左到右,从上到下滑动

4.1 卷积

上面描述,卷积可以理解为一个过滤器,用于提取特征

常见的过滤器尺寸为3×3和5×5

一般来说,通过卷积层处理过的节点矩阵会变得更深

过滤器的前向传播过程就是通过左侧小矩阵中的节点计算出右侧单位矩阵中节点的过程

4.2 卷积的边界处理-padding

上图的右图convolved feature,卷积后的矩阵只有3×3,比原来的图片要小,因为边界没有了,需要考虑这个边界的问题;tensorflow中的conv2d的'padding'参数可以设为两个值SAME,VALID

对输入的矩阵,包裹n层0,然后再进行卷积,求n值:

  • FULL FULL: edge_row = kernel_row - 1; edge_cols = kernel_cols - 1
  • SAME: edge_row = (kernel_row - 1) / 2; edge_cols = (kernel_cols - 1) / 2
  • VALID:edge_row = edge_cols = 0

5. 多卷积核

上面所述只有100个参数时,表明只有1个100×100的卷积核,显然,特征提取是不充分的。

多个滤波器得到对图像的不同特征的放映,称之为Feature Map.

比如100个卷积核×每种卷积核共享100个参数=100×100=10K,也就是1万个参数

在实际应用中,往往使用多层卷积,然后再使用全连接层进行训练,多层卷积的目的是一层卷积学到的特征往往是局部的,层数越高,学到的特征就越全局化。

dl/cnn/1365562217_2880.jpg

6. Down-pooling

池化操作可以认为将一张分辨率高的图片转化为分辨率低的图片

不会改变三维矩阵的深度,但是它可以缩小矩阵的大小,进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络参数的目的

池化:空间或特征类型的聚合

下图显示池化如何应用于一个图像的四块不重合区域

dl/cnn/downpool.gif

在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如softmax分类器,但这样做面临计算量的挑战

例如:对于一个96X96像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个(96−8+1)(96−8+1)=7921维的卷积特征,由于有400个特征,所以每个样例 (example) 都会得到一个892400 = 3,168,400维的卷积特征向量。学习一个拥有超过3百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。

为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。

池化分为两种

  1. 最大池化,在选中区域中找最大的值作为抽样后的值
  2. 平均值池化,把选中的区域中的平均值作为抽样后的值,这样做的,原因是为了后面全连接的时候减少连接数

7. 隐藏节点的数量

只跟卷积的步长有关。比如步长为1,隐藏节点的数量和输入数量相等。如果步长为5,那么每5×5的像素才需要一个隐藏节点,数量为原先的1/25.

8. LeNet-5

dl/cnn/LeNet5.png

8.1 C1层

C1层是一个卷积层,由6个特征图Feature Map构成(6个不同的卷积核)。特征图中每个神经元与输入为5×5的邻域相连(5×5为局部野的大小)。特征图的大小为28×28,这样能防止输入的连接掉到边界之外(32-5+1=28)。C1有156个可训练参数(每个滤波器5×5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)×6=156个参数),共156×(28×28)[这里的28×28为隐藏层神经元的个数]=122304个连接。

8.2 S2层

2×2的平均池化层用来进行降采样

S2层是一个下采样层,有6个1414的特征图。特征图中的每个单元与C1中相对应特征图的22邻域相连接。S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。每个单元的22感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。S2层有12(6(1+1)=12)个可训练参数和5880(1414(2*2+1)*6=5880)个连接。

8.3 C3层

C3层也是一个卷积层,它同样通过5x5的卷积核去卷积层S2,然后得到的特征map就只有(14-5+1)x(14-5+1)个神经元,但是它有16种不同的卷积核,所以就存在16个特征map了。

这里的16个Feature Map不是全部连接到前面的S2层,增加了模型的多样性

9. Stanford笔记

建立英文的感觉

Architecture Overview

Recall: Regular Neural Nets. As we saw in the previous chapter, Neural Networks receive an input (a single vector), and transform it through a series of hidden layers. Each hidden layer is made up of a set of neurons, where each neuron is fully connected to all neurons in the previous layer, and where neurons in a single layer function completely independently and do not share any connections.(note:全连接,且不共享参数) The last fully-connected layer is called the “output layer” and in classification settings it represents the class scores.

Regular Neural Nets don’t scale well to full images. In CIFAR-10, images are only of size 32x32x3 (32 wide, 32 high, 3 color channels), so a single fully-connected neuron in a first hidden layer of a regular Neural Network would have 32323 = 3072 weights.(note:一个神经元就是3072个权重参数) This amount still seems manageable, but clearly this fully-connected structure does not scale to larger images. For example, an image of more respectible size, e.g. 200x200x3, would lead to neurons that have 2002003 = 120,000 weights. Moreover, we would almost certainly want to have several such neurons, so the parameters would add up quickly! Clearly, this full connectivity is wasteful and the huge number of parameters would quickly lead to overfitting.(note:讲述了全连接的参数过大,容易过拟合的问题)

3D volumes of neurons. Convolutional Neural Networks take advantage of the fact that the input consists of images and they constrain(约束) the architecture in a more sensible(敏感) way. In particular, unlike a regular Neural Network, the layers of a ConvNet have neurons arranged in 3 dimensions: width, height, depth. (Note that the word depth here refers to the third dimension of an activation volume, not to the depth of a full Neural Network, which can refer to the total number of layers in a network.) For example, the input images in CIFAR-10 are an input volume of activations, and the volume has dimensions 32x32x3 (width, height, depth respectively). As we will soon see, the neurons in a layer will only be connected to a small region of the layer before it, instead of all of the neurons in a fully-connected manner. Moreover, the final output layer would for CIFAR-10 have dimensions 1x1x10, because by the end of the ConvNet architecture we will reduce the full image into a single vector of class scores, arranged along the depth dimension. Here is a visualization:

source

知乎

知乎墙

生物学连接

首先介绍些背景。当你第一次听到卷积神经网络这一术语,可能会联想到神经科学或生物学,那就对了。可以这样说。CNN 的确是从视觉皮层的生物学上获得启发的。视觉皮层有小部分细胞对特定部分的视觉区域敏感。Hubel 和 Wiesel 于 1962 年进行的一项有趣的试验详细说明了这一观点,他们验证出大脑中的一些个体神经细胞只有在特定方向的边缘存在时才能做出反应(即放电)。例如,一些神经元只对垂直边缘兴奋,另一些对水平或对角边缘兴奋。Hubel 和 Wisesl 发现所有这些神经元都以柱状结构的形式进行排列,而且一起工作才能产生视觉感知。这种一个系统中的特定组件有特定任务的观点(视觉皮层的神经元细胞寻找特定特征)在机器中同样适用,这就是 CNN 的基础。

作者:机器之心 链接:https://www.zhihu.com/question/52668301/answer/131573702 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。