10.4 VGG16的Tensorflow实现

10.4.1 VGG-16简介

VGG卷积神经网络是牛津大学2014年提出的模型,这个模型提出后,由于他的简洁性和实用性,马上成为了当时最为流行的卷积神经网络模型。2014年,VGG模型获得了ILSVRC竞赛的第二名,第一名是GoogleNet。VGG-16是深度为16的VGG模型。

VGG-16的网络很简单,有13个卷积层(被5个max-pooling层分割)和3个全连接层。所有卷积层的过滤器大小都是3×3,步长为1,进行padding。作者设置所有卷积层的过滤器大小都为3×3是有原因的,因为卷积核尺度更大的卷积层可以使用多个3×3卷积层来达到同样的效果,比如2个连在一起的3×3卷积层(步长为1)的接收域与5×5的卷积层的接收域一样。作者还给出了更多的解释,首先,使用多个3×3卷积层而不是相同接收域的一层卷积层,可以提高网络的分类能力(相当于添加了隐式的正则化)。第二,可以减少参数数量。

5个max-pooling分别在第2、4、7、10、13卷积层后面,池化效果是特征图长宽减少一半(filter 2×2,步长2)。作者并没有使用local response normalisation (LRN),因为通过对比实验发现LRN并没有提高网络的表现,反而增加的网络的参数。

每次max-pooling之后,特征图的channel都会乘以2,从64开始,直到512,之后保持不变。

之后的全连接层的大小分别为4096、4096、1000,因为改网络的目的是对ILSVRC的1000个类分类,所以网络最后使用softmax层。

由于我们开发的是猫狗大战应用,所以需要将最后的分类改变成两类。

10.4.2 定义功能函数

无论是什么卷积神经网络,最基础的操作一定是卷积、池化和全连接,所以我们首先定义这三个操作。

我们定义的卷积操作的卷积核为3*3的卷积核,使用的填充为“SAME”填充,步长为1。

我们采用最大池化,池化核为2*2,步长为2,使用”SAME“填充。

全连接操作首先需要计算出经过一系列卷积池化操作后的神经网络的神经元个数,将其进行展开,方便后续分类输出处理。

10.4.3 定义VGG-16功能类

前面我们定义了VGG-16的三个基本操作,这部分我们来实现VGG-16。首先需要对参数进行初始化操作。

接下来是卷积层实现,13个卷积层分别被5个最大池化层进行分割,具体实现如图10-9所示。

最后是全连接层的实现,三个全连接层在整个网络的最后对神经网络进行展平操作。

Last updated