logo

CNN 网络概览

王哲峰 / 2022-07-15


目录

CNN 发展历史

CNN 在计算机视觉的三大领域: 图像识别目标检测语义分割(图像分割) 有着广泛的应用

1985年,Rumelhart 和 Hinton 等人提出了 反向传播算法,Back-Propagaion, 即著名的反向传播算法训练神经网络模型,奠定了神经网络的理论基础

深度学习三巨头(Yann LeCun, Geoffrey Hinton, Yoshua Bengio)之一 Yann LeCun 在 BP 算法提出之后三年, 发现可以用 BP 算法训练一种构造出来的多层卷积网络结构,并用其训练出来的卷积网络识别手写数字。 LeCun 正式提出了卷积神经网络(Convolutional Neural Network, CNN)的概念

LeCun 正式提出 CNN 概念之后,在 1998年 提出了 CNN 的开山之作:LeNet-5 网络

进入 21 世纪后,由于计算能力和可解释性等多方面的原因,神经网络的发展经历了短暂的低谷, 直到 2012 年 ILSVRC 大赛上 AlexNet 一举夺魁,此后大数据兴起, 以 CNN 为代表的深度学习方法逐渐成为计算机视觉、语音识别和自然语言处理等领域的主流方法, CNN 才开始正式发展起来

CNN 整体结构

全连接的神经网络或 DNN 中,Affine 层(仿射层)后面跟着激活函数 ReLU 层。 最后是 Affine 层加 Softmax 层输出最终结果(概率),但是全连接层存在一些问题:

一个典型的 CNN 通常包括下面这三层:

CNN 卷积层

Convolutional layer

卷积的含义

从数学的角度解释, 卷积可以理解为一种类似于 加权运算 一样的操作。 在图像处理中, 针对图像的像素矩阵, 卷积操作就是用一个卷积核来逐行逐列的扫描像素矩阵, 并与像素矩阵做元素相乘, 以此得到新的像素矩阵, 这个过程称为卷积(Convolutional). 其中:

卷积的数学解释

在泛函分析中, 卷积也叫做 旋积 或者 褶积, 是一种通过两个函数 $x(t)$$h(t)$ 生成的数学算子, 其计算公式如下:

$$x(t)h(t)(\tau)=\int_{- \infty}^{+ \infty} x(\tau)h(\tau - t)dt$$

$$x(x)h(x)(\tau)=\sum_{\tau=-\infty}^{+ \infty} x(\tau)h(\tau - t)$$

两个函数的卷积就是:

所以卷积本质上就是一个 Reverse-Shift-Weighted Summation 的操作

卷积的图形解释

函数 $x(t)$$h(t)$ 图像如下:

img

img

卷积类型

因为图像有单通道图像(灰度图)和多通道图(RGB 图),所以对应常规卷积方式可以分为单通道卷积和多通道卷积。 二者本质上并无太大差异,无非对每个通道都要进行卷积而已。 针对图像的像素矩阵,卷积操作就是用一个卷积核来逐行逐列的扫描像素矩阵, 并与像素矩阵做元素相乘,以此得到新的像素矩阵

单通道卷积

一个标准的单通道卷积如下图所示:

img

对于单通道卷积,假设输入图像(输入特征图)维度为 $n \times n \times c = 5 \times 5 \times 1$, 滤波器维度为 $f \times f \times c = 3 \times 3 \times 1$,步长(stide)为 $s=1$,填充(padding) 大小为 $p=0$, 那么输出图像(输出特征图)维度可以计算为:

$$\Bigg(\frac{n+2p-f}{s} + 1\Bigg) \times \Bigg(\frac{n+2p-f}{s} + 1\Bigg) \times c =3 \times 3 \times 1$$

多通道卷积

img img img

3 维卷积运算的输入图像数据为 3 通道(channel)的 RGB 数据

3 维图像数据卷积运算

多通道图卷积与单通道卷机相似,比如现在有一个输入图像维度为 $5 \times 5 \times 3$ 的 RGB 3 通道图像,可以将其看成是 3 张 $5 \times 5$ 图像的堆叠, 这时候把原先的单通道滤波器乘 3,用 3 个滤波器分别对着 3 张图像进行卷积, 将卷积得到 3 个特征图加总起来便是最后结果。这里强调一点: 滤波器的通道数一定要跟输入图像的通道数一致,不然会漏下某些通道得不到卷积

现在用 $f \times f \times c = 3 \times 3 \times 3$ 的滤波器对 $n \times n \times c = 5 \times 5 \times 3$ 的输入进行卷积, 得到的输出维度为 $3 \times 3$。这里少了通道数,所以一般会用多个 3 通道滤波器来进行卷积, 假设这里用了 10 个 $3 \times 3 \times 3$ 的滤波器,那最后的输出便为 $3 \times 3 \times 10$, 滤波器的个数变成了输出特征图的通道数

img img

3D 卷积

将 2D 卷积增加一个深度维便可扩展为 3D 卷积。输入图像是 3 维的,滤波器也是 3 维的,对应的卷积输出同样是 3 维的

也可以从 3D 的角度来理解多通道卷积:可以将 $3 \times 3 \times 3$ 的滤波器想象为一个三维的立方体, 为了计算立方体滤波器在输入图像上的卷积操作,首先将这个三维的滤波器放到左上角, 让三维滤波器的 27 个数依次乘以红绿蓝三个通道中的像素数据,即滤波器的前 9 个数乘以红色通道中的数据, 中间 9 个数乘以绿色通道中的数据,最后 9 个数乘以蓝色通道中的数据。 将这些数据加总起来,就得到输出像素的第一个元素值。示意图如下所示

img

可以把 2D 卷积的计算输出公式进行扩展,可以得到 3D 卷积的输出维度计算公式。 假设输入图像大小为 $a_{1} \times a_{2} \times a_{3} \times c$,通道数为 $c$, 滤波器大小为 $f \times f \times f \times c$, 滤波器数量为 $n$,则输出维度可以表示为

$$(a_{1} - f) \times (a_{2} - f) \times (a_{3} - f) \times n$$

3D 卷积在医学影像数据、视频分类等领域都有着较为广泛的应用。 相较于 2D 卷积,3D 卷积的一个特点就是卷积计算量巨大,对计算资源要求相对较高

转置卷积

转置卷积(Transposed Convolution)也叫解卷积(Deconvolution)、反卷积。 在常规卷积时, 每次得到的卷积特征图尺寸是越来越小的, 但在图像分割等领域, 需要逐步恢复输入时的尺寸, 如果把常规卷积时的特征图不断变小叫做 下采样, 那么通过转置卷积来恢复分辨率的操作可以称作 上采样

img img

1x1 卷积

深度可分离卷积

空洞卷积

空洞卷积也叫扩张卷积、膨胀卷积, 简单来说就是在卷积核元素之间加入一些空格(零)来扩大卷积核的的过程, 可以用一个扩张率 $a$ 来表示卷积核扩张的程度

img

img

加入空洞之后的实际卷积核尺寸与原始卷积尺寸之间的关系如下:

$$K = k+(k-1)(a-1)$$

其中:

空洞卷积优点:

卷积步幅

应用滤波器的位置的间隔称为 步幅(Stirde),滤波器移动的步幅为 1 时, 即滤波器在像素矩阵上一格一格平移, 滤波器也可以以 2 个或更多的单位平移

卷积填充

import numpy as np

def zero_pad(X, pad):
    X_pad = np.pad(
        X, 
        ((0, 0), (pad, pad), (pad, pad), (0, 0)), 
        "constant"
    )
    return X_pad

np.random.seed(1)
x = np.random.randn(4, 3, 3, 2)
x_pad = zero_pad(x, 2)

fig, ax = plt.subplots(1, 2)
ax[0].set_title("x")
ax[0].imshow(x[0, :, :, 0])
ax[1].set_title("x_pad")
ax[1].imshow(x_pad[0, :, :, 0])

img

卷积输出维度

如何确定经过卷积后的输出矩阵的维度?

对于单通道卷积和多通道卷积,假设输入图像维度为 $n \times n \times c$, 滤波器维度为 $f\times f \times c$,卷积步长(stide)为 $s$,填充(padding) 大小为 $p$, 那么输出维度可以计算为:

$$\Bigg(\frac{n+2p-f}{s} + 1\Bigg) \times \Bigg(\frac{n+2p-f}{s} + 1\Bigg)$$

卷积滤波器初始化和学习

CNN 池化层

Pooling layer

池化层介绍

img

池化层的作用

池化层操作

CNN 全连接层 Full Connected layer

池化完成之后就是标准 DNN 中的全连接层了。相邻层的所有神经元之间都有连接, 这称为全连接层(Full Connected layer), 可以使用 Affine 层实现全连接层

参考