[深度学习概念]·CNN卷积神经网络原理分析

目录

2.0 卷积神经网络简述

2.1 二维卷积层

2.1.1. 二维互相关运算

2.1.2. 图像中物体边缘检测

2.1.3. VGGNet实例边缘检测分析


2.0 卷积神经网络简述

本章将介绍卷积神经网络。它是近年来深度学习能在计算机视觉领域取得突破性成果的基石。它也逐渐在被其他诸如自然语言处理、推荐系统和语音识别等领域广泛使用。我们将先描述卷积神经网络中卷积层和池化层的工作原理,并解释填充、步幅、输入通道和输出通道的含义。在掌握了这些基础知识以后,我们将探究数个具有代表性的深度卷积神经网络的设计思路。这些模型包括最早提出的AlexNet,以及后来的使用重复元素的网络(VGG)、网络中的网络(NiN)、含并行连结的网络(GoogLeNet)、残差网络(ResNet)和稠密连接网络(DenseNet)。它们中有不少在过去几年的ImageNet比赛(一个著名的计算机视觉竞赛)中大放异彩。虽然深度模型看上去只是具有很多层的神经网络,然而获得有效的深度模型并不容易。有幸的是,本章阐述的批量归一化和残差网络为训练和设计深度模型提供了两类重要思路。

2.1 二维卷积层

卷积神经网络(convolutional neural network)是含有卷积层(convolutional layer)的神经网络。本章中介绍的卷积神经网络均使用最常见的二维卷积层。它有高和宽两个空间维度,常用来处理图像数据。本节中,我们将介绍简单形式的二维卷积层的工作原理。

2.1.1. 二维互相关运算

虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使用更加直观的互相关(cross-correlation)运算。在二维卷积层中,一个二维输入数组和一个二维核(kernel)数组通过互相关运算输出一个二维数组。 我们用一个具体例子来解释二维互相关运算的含义。如图5.1所示,输入是一个高和宽均为3的二维数组。我们将该数组的形状记为3×33×3或(3,3)。核数组的高和宽分别为2。该数组在卷积计算中又称卷积核或过滤器(filter)。卷积核窗口(又称卷积窗口)的形状取决于卷积核的高和宽,即2×22×2。图5.1中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+1×1+3×2+4×3=190×0+1×1+3×2+4×3=19。

二维互相关运算

图 2.1 二维互相关运算

在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。图5.1中的输出数组高和宽分别为2,其中的4个元素由二维互相关运算得出:

0×0+1×1+3×2+4×3=19,

1×0+2×1+4×2+5×3=25,

3×0+4×1+6×2+7×3=37,

4×0+5×1+7×2+8×3=43.

下面我们将上述过程实现在corr2d函数里。它接受输入数组X与核数组K,并输出数组Y

代码:

import numpy as np

def corr2d(X,K):
    h,w = X.shape
    h1,w1 = K.shape
    Y = np.zeros(shape=(h - h1 + 1, w - w1 +1))

    for i in range(Y.shape[0]):
        for j in range(Y.shape[1]):
            Y[i,j] = np.sum(X[i:i+h1,j:j+w1]*K)

    return(Y)


X = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
K = np.array([[0, 1], [2, 3]])

Y = corr2d(X,K)
print(Y)

输出:

[[19. 25.]
 [37. 43.]]

2.1.2. 图像中物体边缘检测

下面我们来看一个卷积层的简单应用:检测图像中物体的边缘,即找到像素变化的位置。首先我们构造一张6×86×8的图像(即高和宽分别为6像素和8像素的图像)。它中间4列为黑(0),其余为白(1)。

In [4]:
import numpy as np
X = np.ones((6, 8))
X[:, 2:6] = 0
X
Out[4]:
[[1. 1. 0. 0. 0. 0. 1. 1.]
 [1. 1. 0. 0. 0. 0. 1. 1.]
 [1. 1. 0. 0. 0. 0. 1. 1.]
 [1. 1. 0. 0. 0. 0. 1. 1.]
 [1. 1. 0. 0. 0. 0. 1. 1.]
 [1. 1. 0. 0. 0. 0. 1. 1.]]

然后我们构造一个高和宽分别为1和2的卷积核K。当它与输入做互相关运算时,如果横向相邻元素相同,输出为0;否则输出为非0。

In [5]:
K = np.array([[1, -1]])

下面将输入X和我们设计的卷积核K做互相关运算。可以看出,我们将从白到黑的边缘和从黑到白的边缘分别检测成了1和-1。其余部分的输出全是0。

In [6]:
Y = corr2d(X, K)
Y
Out[6]:
[[ 0.  1.  0.  0.  0. -1.  0.]
 [ 0.  1.  0.  0.  0. -1.  0.]
 [ 0.  1.  0.  0.  0. -1.  0.]
 [ 0.  1.  0.  0.  0. -1.  0.]
 [ 0.  1.  0.  0.  0. -1.  0.]
 [ 0.  1.  0.  0.  0. -1.  0.]]

由此,我们可以看出,卷积层可通过重复使用卷积核有效地表征局部空间。用来提取图片的边缘信息。而多层卷积所实现的功能就是对上层卷积结果进行卷积,从而获取更复杂边界信息进行组合。下面我们通过VGGNet来理解一下每层卷积的功能。

2.1.3. VGGNet实例边缘检测分析

在第一层,网络可能会学习像对角线这样的简单事物。在每一层中,网络都能够将这些发现结合起来,并不断学习更复杂的概念。这一切听起来都很模糊,Zeiler和Fergus(2013)在可视化CNN学习的方面做得非常出色。这是他们在论文中使用的CNN。赢得Imagenet竞赛的Vgg16型号基于此。

CNN by Zeiler&Fergus(2013)

这张图片现在看起来很混乱,不要惊慌!让我们从一些我们都可以从这张照片中看到的东西开始。首先,输入图像是正方形和224x224像素。我之前谈到的过滤器是7x7像素。该模型具有输入层,7个隐藏层和输出层。输出层中的C指的是模型预测的类的数量。现在让我们来看看最有趣的东西:模型在不同的层次中学到什么!

CNN的第2层

左图像表示CNN已学习的内容,右图像表示实际图像的一部分。

在CNN的第2层,模型已经获得了比对角线更有趣的形状。

◆ 在第六个方块(水平计数)中,你可以看到模型正在拾取圆形形状

◆ 此外,最后一个正方形正在拾取角落。

CNN的第3层

在第3层,我们可以看到模型开始学习更具体的东西。

◆ 第一个方块显示该模型现在能够识别地理模式

◆ 第六个方块正在识别汽车轮胎

◆ 第十一个方块正在识别人。

CNN的第4层和第5层

最后,第4层和第5层延续了这一趋势。第5层正在拾取对我们的狗和猫问题非常有用的铃声。它也拾取单轮脚踏车和鸟/爬行动物的眼睛。请注意,这些图像仅显示每层学习的一小部分内容。

猜你喜欢

转载自blog.csdn.net/xiaosongshine/article/details/86560279