【深度学习-8】卷积神经网络基础

卷积神经网络(Convolutional Neural Networks,CNNs or ConvNets)是深度学习最重要的技术之一,已经被广泛用于图像识别,语音识别以及自然语言处理等领域。网上有许多关于CNN原理的介绍,我从中挑选出一个比较容易理解的教程来和大家分享。原文地址

卷积神经网络始于上世纪九十年代(1990s)。深度学习的先驱者 Yann LeCun 提出的LeNet5 是最早的卷积神经网络之一。当时的LeNet 主要用于字符识别。近几年来,随着数据和计算能力的不断增长,在LeNet的基础之上,研究人员开发出了越来越多的具有不同结构(architecture)的卷积神经网络,比如 AlexNet (2012),ZFNet (2013),GoogLeNet (2014),VGGNet (2014),ResNets (2015),DenseNet (2016) 等。

尽管卷积神经网络琳琅满目,但是万变不离其宗,只要我们理解了它的基本概念和原理,再学习其他类型的CNN就相对容易许多,甚至可以开发新的卷积神经网络。在学习CNN原理的时候,我的最大体会就是:一图胜千言。对于CNN中的许多概念,光看公式或者文字描述很难理解,如果能配合示意图来学习,可以达到事半功倍的效果。

我们先来看一个简单的CNN是什么样的。如图所示,卷积神经网络的输入是一张照片(input layer),输出的是该照片上的物体分别是猫,狗,船,鸟的概率(output layer)。中间的部分就是神经网络的隐藏层(hidden layer),包括2个convolution layers,2个pooling layers和2个fully connected layers。

《【深度学习-8】卷积神经网络基础》 cnn_1.png

通常一个CNN是由以下4个部分组成:

  1. Convolution
  2. Non Linearity (ReLU)
  3. Pooling
  4. Classification (Fully Connected Layer)

我们将这4个部分进行各种排列组合,就可以构成不同的卷积神经网络。下面我们就来一一认识一下它们。

Convolution

在介绍卷积操作之前,我们先来复习一下如何在计算机中表示图像。一幅图可以看成是一个由像素(pixel)值(0~255)组成的2维矩阵。对于彩色图像来说,我们可以用三个通道(channel)来分别表示red,green和blue的像素值,因此,每幅图可以用3个2维矩阵来表示。灰度(grayscale)图像只有一个通道,2维矩阵中的像素值为0时表示黑色,为255时表示白色。

《【深度学习-8】卷积神经网络基础》 rgb_tensor.png

在CNN中,卷积操作的主要目的就是从原始图像中提取特征(features)。卷积的数学公式比较复杂,我们就用简单的图例来学习卷积是如何计算的。例如,我们有一个5×5的图像和一个3×3的矩阵:

《【深度学习-8】卷积神经网络基础》 convolution_1.png

《【深度学习-8】卷积神经网络基础》 convolution_2.png

它们两者求卷积的过程可以由下面的动态图表示:

《【深度学习-8】卷积神经网络基础》 convolution_3.gif

我们可以看到橙色的矩阵(3×3)在绿色的矩阵(5×5)上从左到右,从上到下依次滑动,并且步长为1(每次只移动一个像素)。每当它移动到某个位置的时候,橙色矩阵和它所覆盖的部分绿色矩阵(3×3)的每个对应的元素相乘并求和,得到一个数值后填入右边convolved feature的矩阵中。

我们把3×3的矩阵称为 filter 或者 kernel,把最后生成的矩阵叫做 Convolved Feature 或者 Feature Map。filter实际上就是在扫描原始图像的过程中提取feature,并生成一个feature map。

对于同一个图像来说,不同的filter可以得到不同的feature map。换句话说,不同的filter可以检测到图像中不同的特征。对于比较复杂的图像,我们往往需要比较多的filter。从下面的例子中我们可以看到许多不同类型的filter以及它们输出的卷积后的图像。

《【深度学习-8】卷积神经网络基础》 convolution_4.png

下面这个动态图展示了2个filter(红框和绿框)分别扫描同一张图,并生成2个不同的feature map的过程。

《【深度学习-8】卷积神经网络基础》 convolution_5.gif

Feature map的大小受3个因素的影响:

  1. Depth(也就是filter的数目)。filter的数目越多,能够识别的pattern越多,扫描原始图像的次数越多,生成的feature map也就越多。
  2. Stride(也就是filter滑动时的步长)。步子迈的越大,生成的feature map越小
  3. Zero-padding。为了让filter能够完整地扫描整个图像(包括图像边界的像素)我们需要给矩阵的四周添加一些值为0的像素,这样我们生成的feature map的大小就可以和原始图像的大小一致。

Non Linearity (ReLU)

在卷积操作完之后还要进行一个非线性化的操作。我们在学习神经网络的激活函数的时候就学过ReLU。它在这里的作用实际上就是把feature map中所有的负值都变为0。

《【深度学习-8】卷积神经网络基础》 ReLU.png

下面的图展示了ReLU处理后的feature map:

《【深度学习-8】卷积神经网络基础》 ReLU-2.png

Pooling

Pooling实际上就是对feature map做降维的过程,可以分为不同的类型(比如Max,Average,Sum等)。

我们以Max Pooling为例,首先定义一个2×2的window,然后在Rectified Feature Map上滑动,每到一个位置的时候,取window中4个值的最大值,填入新的矩阵中。这样我们就实现了降维(从4×4的矩阵到2×2的矩阵),从而减少网络中的参数和计算量,避免过拟合(overfitting)。

《【深度学习-8】卷积神经网络基础》 max_pooling.png

下面的图显示的是经过Max/Sum pooling操作后的feature map:

《【深度学习-8】卷积神经网络基础》 pooling.png

Fully Connected Layer

我们通过卷积层和pooling层提取出了原始图像的feature,Fully Connected Layer的目的就是用这些feature来对原始图像进行分类(classification)。Fully Connected指的是一层中的神经元与其下一层中的所有神经元都有连接。

用作者文章中的一句话做总结:
As discussed above, the Convolution + Pooling layers act as Feature Extractors from the input image while Fully Connected layer acts as a classifier.

训练CNN的方法仍然是我们之前学过的反向传播(Backpropagation)算法。通过梯度下降(gradient descent),不断地更新 filter和weight的值来最小化网络的error,从而学习到最优的参数,使得CNN能够正确地识别训练集中的图像。

当我们理解了CNN的基本原理后,就可以用TensorFlow和图像数据来构建并训练一个真实的卷积神经网络。预知后事如何,且听下回分解。

参考文献

https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

《【深度学习-8】卷积神经网络基础》 qrcode.jpg

    原文作者:Rapp
    原文地址: https://www.jianshu.com/p/d30df9bd8788
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞