CS231 第五讲 卷积神经网络
课程视频地址:https://study.163.com/courses-search?keyword=CS231
课程主页:http://cs231n.stanford.edu/2017/
这一讲主要介绍卷积神经网络。
第一部分是介绍历史,这里略过,直接进入正题。
卷积神经网络
卷积神经网络主要用于计算机视觉领域,处理对象为图片,首先来比较卷积神经网络和之前介绍的神经网络的区别。
之前介绍的神经网络每层被称为全连接层,形式如下
而卷积神经网络有卷积层,形式如下
那么为什么要使用卷积层而不是全连接层呢?主要如下两个原因。第一个原因是全连接层的权重太多,例如$200\times 200\times 3$的图像将有$120,000$个权重,这很容易导致过拟合(参数太多)以及计算成本太大;第二个原因是图像中有很多模式重复出现,例如边缘等等,使用滤波器可以复用这些共同特征。
下面详细介绍卷积层。
卷积层
下面假设图像的维度为$W_1 \times H_1 \times D_1$,一般来说,滤波器前两个维度相等,而第三个维度必须等于图像的第三个维度,从而这里假设滤波器的维度为$F\times F\times D_1$。之前演示的是一个滤波器的情形,实际中常常使用多个滤波器,此时的输出结果如下
实际中,用$K$表示滤波器的个数。下面以一个例子展示计算步骤,以$D_1= 1$为例
首先将滤波器放在图片左上角,将对应元素相乘并求和,这就得到了$0$,即输出结果左上角的元素,然后将滤波器向右平移$1$个像素,继续上述步骤得到$30$,依次类推可以计算完第一行,接着将滤波器放到图片第二行的位置,重复之前的操作,最终可以得到输出结果。
从这个例子出发,接着介绍卷积层中几个重要概念。
步长(stride)
上面的例子中,我们每次移动一个单位,而实际中可以移动多个单位,每次移动的单位数量就叫做步长,记为$S$。我们来看个具体例子
第一步的计算没有变化,第二步直接将滤波器向右移动两格,来到下图蓝点的位置,得到的结果如下
按照这个步骤继续计算可得
从上述结果不难发现,如果步长为$S$,输出维度为$W_2 \times H_2 \times D_2$,那么
其中$W_1 \times H_1 \times D_1$为输入的维度,$F\times F\times D_1$为滤波器的维度,$K$为滤波器的数量。
注意这里我们要选择$S$,使得$(W_1 - F) / S,(H_1 - F) / S $为整数(这部分和吴恩达老师在Coursera上的课程有些出入,吴恩达老师没有提到这个要求)。
从这个例子中我们不难发现两点,第一点是如果经过几次卷积操作,图像就会缩小太多;第二点是图像角落边缘的像素执行卷积操作的次数太少,会丢失很多信息,于是就有了第二个操作,填充(padding)。
填充(padding)
填充的操作很简单,在执行卷积操作之前现在图像边缘填充$0$,具体效果如下
把上述两点进行总结如下:
假设输入维度为维度为$W_1 \times H_1 \times D_1$,超参数为
- 滤波器数量$K$
- 滤波器的维度$F\times F\times D_1$
- 步长$S$
- 填充数量$P$
那么输出维度为$W_2 \times H_2 \times D_2$,其中
注意每个滤波器的参数个数为$F.F. D_1$,所以滤波器的参数个数为$(F.F. D_1).K$,偏差个数为$K$,即一共有$(F.F. D_1+1).K$个参数。
实际应用中,还有一个重要操作为池化。
池化层
池化的目的是降低数据维度,具体效果如下(下图展示的是最大值池化,实际中还有平均值池化)
池化层也有对应的步长,填充参数,计算维度的方式和之前相同。
全连接层
全连接层就是普通的神经网络,这里从略。
卷积神经网络架构
实际的卷积神经网络是由卷积层,池化层以及全连接层组合而成,来看一个例子