[CS231n]4·Convoluntional Neural Networks

CS231n Convolutional Neural Networks for Visual Recognition

https://www.bilibili.com/video/BV1nJ411z7fe

Architecture Overview

在图像处理的任务中,图片的特征具有局部性,而全连接的传统神经网络引入了太多冗余的参数,既浪费又难以训练。因此,CNN 被提出以解决这个问题。CNN 的架构和传统神经网络架构类似,都具有输入层、隐藏层和输出层。不同的是,CNN 中每一层都是 \(3\) 维的神经元,如下图所示:

例如,CIFAR-10 数据集的输入可以是 \(32\times32\times3\) 的,即 \(\text{RGB}\) 三个通道分别有 \(32\times32\) 的像素;其输出可以是 \(1\times1\times10\),分别表示 \(10\) 个分类上的得分。

下面来详细分析 CNN 中各种层的结构。


Layers used to build CNN

CNN 中主要有三种层:Convolutinal Layer, Pooling Layer, Fully-Connected Layer,将它们堆叠在一起就可以形成一个 CNN 的架构。

例如,[INPUT - CONV - RELU - POLL - FC] 就是一种简单的 CNN 架构。其中,CONV / FC 层具有需要学习的参数,而 RELU / POOL 层是固定的函数;CONV / FC / POOL 层都有超参数,而 RELU 没有。

Convolutional Layer

Convolutional Layer 是 CNN 的核心。其基本思想很简单,就是用一个卷积核filter / kernel)在输入图像上扫一遍,得到输出图像,其中卷积核的参数就是神经网络要学习的参数。设输入深度为 \(D_1\),则这个卷积核的深度也是 \(D_1\),即将输入图像某一区域所有层的数据一起做线性组合;如果输入的深度是 \(D_2\),那么我们需要 \(D_2\) 个不同的卷积核,形成输出的不同层。

正式地说,设输入是一个 \(W_1\times H_1\times D_1\)\(3\) 维数组(即上一层),Convolutional Layer 有以下几个超参数:

  • \(K\):filters 的个数
  • \(F\):filters 的边长
  • \(S\):filters 进行扫描时的步长
  • \(P\):zero padding,在输入图像的边缘补充的长度

输出一个 \(W_2\times H_2\times D_2\)\(3\) 维数组,其中: \[ \begin{align} W_2&=(W_1-F+2P)/S+1\\ H_2&=(H_1-F+2P)/S+1\\ D_2&=K \end{align} \] 在进行卷积操作时,我们需要注意计算得到的 \(W_2\)\(H_2\) 是不是整数,如果不是,需要调整 \(P\) 或者 \(S\)。另外,注意对于输出的每一个 depth slice,其上的神经元是由同一个卷积核算出来的,分享了同样的参数,这有助于减少 CNN 的参数数量。


im2col 是实现卷积操作的一个方法,正如其名 image to column,它将二维图像变成一个列向量以方便地实施卷积操作。举例说明,假设输入图像是 \([227\times227\times3]\),使用 \([11\times11\times3]\) 的卷积核并取步长为 \(4\),想要得到 \([55\times 55\times96]\) 的输出。那么,我们将 \([11\times 11\times 3]\) 的卷积核拉伸成 \(11\times11\times3=363\) 维的行向量,各卷积核拼接起来得到 \([96\times 363]\) 的参数矩阵;然后把输入图像中对应 \(55\times 55\) 个位置的 \([11\times11\times3]\) 全拿出来拉伸成列向量并顺次拼接成 \([363\times 3025]\) 的矩阵;二者相乘即可得到 \([96\times 3025]\) 的矩阵,每一行的列向量还原成 \([55\times 55]\) 即得到输出结果。

Pooling Layer

插入 Pooling Layer 是为了减小当前层的大小,与 Convolutional Layer 类似,它用一个 filter 扫描整个图像,然后做某种无参数的计算,如取 \(\max\) (max pooling) 或者 \(\text{L2 norm}\) (L2-norm pooling) 或者平均值 (average pooling).

Fully-connected Layer

CNN 中的全连接层和传统神经网络的全连接层一模一样,一般最后连接输出层的时候用全连接层。

FC Layer 可以和 CONV Layer 相互转化:

  • CONV 转 FC:只需要强行设定 FC 中某些权重为 \(0\)
  • FC 转 CONV:设定 CONV 卷积核大小与输入相同,那么一次卷积运算相当于 FC 前一层到后一层的某一个神经元的运算。

CNN Architectures

上一节讲了 CNN 中主要的三种层,这一节讲如何把它们的组合在一起形成 CNN.

Layer Patterns

最常见的各种层的组合是:

INPUT -> [ [ CONV -> RELU ] * N -> POOL? ] * M -> [FC -> RELU] * K -> FC

即若干 CONV-RELU layers,选择性地接 POOL layer,重复该结构直到最后接上传统的神经网络。


实践中注意一点:相比用一个具有较大 filter 的卷积层,更好的是使用多个具有较小 filter 的卷积层堆叠起来,因为一方面,堆叠起来的层引入更多非线性因素,使神经网络更强大;另一方面,后者具有更少的参数。

Layer Sizing Patterns

  • input layer:最好能被 \(2\) 整除很多次;
  • conv layers:应使用小的 filters(如 \(3\times 3\) 或最多 \(5\times 5\)),使用步长 \(S=1\),并且使用 zero padding 保证输出图像的大小和输入的大小相等(取 \(P=(F-1)/2\) 即可),这样能够防止略过图像边缘的信息,而把缩小 feature map 的任务交给 Pooling layer;
  • pool layers:负责缩小输入的大小。最常用一个 \(2\times 2\) 的 filter 以步长为 \(2\) 扫描一遍,丢掉恰好 \(75\%\) 的结果;也可以使用 \(3\times 3\) 的 filter,但是基本不用 \(>3\) 的 filter,因为这样太过 aggresive 而使得结果变差。

Case studies

有一些经典的 CNN 结构有一个名字,例如:


[CS231n]4·Convoluntional Neural Networks
https://xyfjason.github.io/blog-main/2021/03/03/CS231n-4·Convoluntional-Neural-Networks/
作者
xyfJASON
发布于
2021年3月3日
许可协议