0

卷积神经网络(1)——基本概念

这是我的第一篇介绍卷积网络的博客,卷积神经网络(Convolutional Neural Networks)不单单比人工神经网络有更多的层数,而且它的每一层有不同的设计,相比人工神经网络每一层是对每个像素点进行描述,CNN的每一层对图片的作用是不同的,有些层“看”图片的轮廓,有些层“看”图片的颜色,有些层“看”图片的形状等等。CNN在图像处理方面具有非常强大的分类和识别能力。下面介绍CNN的基本的概念,主要内容如下

  • 卷积层
    • Local receptive fields
      • Patch/Kernel/Filter
      • Width
      • Depth
      • Padding
      • Stride
      • Shared weights(共享权重)
    • Feature map
    • ReLU
  • 池化层
    • Pooling(池化/下采样)
  • 全连接层(Full Connected Layer)

继续写这篇文章,我忽然发现我有点心虚,因为毕竟自己所学尚浅,天资愚笨,而且笨嘴拙舌,怕不能把所学的内容将清除,误人子弟,因此如果读者发现有错,请及时在评论区提出。

基本的卷积神经网络一般有卷积层,ReLU层,池化层以及全连接层这几个部分,在很多时候,ReLU层都是和卷积层合并统称为卷积层。如下图所示

convnet

图片来自:http://cs231n.github.io/assets/cnn/convnet.jpeg

那么,我们先从卷基层开始介绍然后对每个层内部的细节进行一一介绍吧。

卷积层 Convolutional Layer

在详细介绍卷积层之前,我们先看下面一张图

depthcol

图片来自:http://cs231n.github.io/assets/cnn/depthcol.jpeg

在上图中,左边的是卷积层的输入,左边红色小区域是仿射域(其实就是filter的输入,一般是固定大小,是一个从卷积层输入从左到右,从上到下滑动的窗口,滑动的步长成为stride),右边是紫色的大的正方体是卷积层的输出,右边小的有5个圆圈的紫色立方体是filter。这里介绍完了之后一定还是有点晕的,下面再详细的介绍这概念的之间的关系。

对于卷积神经层的输入,例如一张图片,如上图所示,输入的维度是$depth=3$,$width=32$,$height=32$。对于filter的每个neuron,图中有5个neuron,每个neuron的都有权重,而且他们之间的权重是不同的,每个neuron的权重的维度为:$depth=3$(与输入的$depth$相同),$width=height$,并且$width$与仿射域的$width$相同,默认情况下,仿射域,输入以及每个neuron的$with$和$height$相等。输入的每个$depth$是一个Feature map。

介绍完了这些,那下面介绍卷积层工作的具体细节吧,首先仿射域按照一定的stride滑动这个窗口,然后与每个neuron做卷积,期间,对于每个$depth$以及每个$stride$的输入,他们与每个neuron做卷积的权重是不变的,这就叫做Shared weights(共享权重)。最后得到的结果的维度应该是output_depth=depthoutput_width=output_height=(width – filter + 2*padding)/stride + 1,其中$width$是卷积层输入的$width$,$filter$是filter的$width$,而$padding$是补零的个数,$stride$是步长,关于$padding$,如下图所示

2016-12-14_185417

图片来自:http://cs231n.github.io/convolutional-networks/

图中,我们有$height=5$,$width=5$以及$depth=3$的卷积层输入,这里我们的$stride=2$,$padding=1$,表示在输入的周围补了一层$0$。继续观察图可以发现,图中的filter有2个neuron,每个neuron有三层,对应于输入的$depth$,每一个$depth$的维度和仿射域的维度是一致的,而卷积层的输出的维度是$3 \times 3 \times 2$。

下图也是一个例子

2016-12-14_190903

一个例子

其实filter里面的每个neuron也可以比喻成具有不同价值观(权重)的读者,然后他们对《哈姆雷特》进行理解,得到了相应的输出——一千个读者就有一千个哈姆雷特。这里有一个链接可以观看卷积层操作的动画: cs231n.github.io/assets/conv-demo/index.html 。

当我们得到卷积层输出之后,一半需要将其输入激活函数进行非线性操作,一般我们会采用ReLU 激活函数进行激活操作,其操作的细节是对输入的每个元素进行与$0$的比较,大于零的就输出其本身,小于零的就输出零,激活函数的输出的维度与其输入没有发生变化,公式如下

\begin{equation}
ReLU(x) = max\{0, x\}
\end{equation}

除了ReLU激活函数之外,还有sigmoidtanh(双曲正切)Leaky ReLUELU以及Maxout 等激活函数。

池化层 Pooling Layer

池化层也叫做下采样层,当我们得到卷积层的输出之后,为了减少维度以及减小过拟合而采取的一种对输出的下采样,我们需要对每个$depth$进行下采样,下采样同样需要窗口和步长。

pool

图片来自:http://cs231n.github.io/assets/cnn/pool.jpeg

池化操作一般有max pooling以及average pooling,max和average分别是区窗口内的最大值和平均值。下图是一个例子

最终得到的结果$depth$不变,$width$有所缩小。

全连接层 Full Connected Layer

其实全连接层一般是BP神经网络,关于BP神经网络,这里不在详细介绍,详细内容可以看这个教程:http://neuralnetworksanddeeplearning.com/

总结

介绍到这里差不多就结束了,一般在工程中我们需要对卷积层,池化层以及全连接层的每个参数进行训练以得到最佳的性能,关于工程的内容,接下来的博客会议LeNet的Tensorflow实现作为介绍。博客写的仓促,也是现学现卖,如果有不对的地方请及时指出。

参考内容

goingmyway

我是一只野生程序猿,我关注机器学习,神经网络,深度学习,增强学习,人工智能,Python,C/C++,Linux

发表评论

电子邮件地址不会被公开。 必填项已用*标注