TensorFlow实现AlexNet卷积网络模型

首先,我们先引入一些我们将会用到的库,并定义-些会用到的变量。设置batch size为32,表示每一轮训练的batch中样本的数目为32。不像基于MNIST或Cifar-10数据集的实验采用包含上百样例的 batch,batch size设置为32是因为图片数据比较大(高度和宽度都达到了224,深度达到了3),采用较大的 batch 会导致显存不足的情况。num_batch是batch的数量,由于不涉及真实图片数据的训练,所以这个数据同时也可以作为训练的轮数。
TensorFlow实现AlexNet卷积网络模型

和 LeNet-5一样,我们定义一个函数inference_op()来实现网络的结构。在函数的一开始,我们定义了存储参数的列表parameters[]。这个列表非常有用,如果我们需要评价模型的反向传播所用的时间,那么需要提供模型参数的值作为梯度下降的依据。AlexNet使用 ReLU作为**函数,原因就在于 ReLU **函数在较深的网络中能够有效地克服sigmoid 存在的梯度消失问题。我们一般会在卷积层之后直接添加一个池化层进行处理,但是AlexNet 在卷积层和池化层之间还加入了一个LRN层。LRN 层是在 AlexNet 中首次被提出并运用。对LRN层的描述最早见于 Alex 那篇用 CNN 参加 ImageNet比赛的论文, Alex 在论文中的解释是:LRN为了模仿生物神经系统的“侧抑制”机制而对局部神经元的活动创建竞争环境,这样做会让其中响应比较大的值变得相对更大,并抑制其他响应较小的神经元,能够进一步增强模型的泛化能力。随后,Alex 在 ImageNet 数据集上分别测试了添加LRN 层的 AlexNet 以及没有添加 LRN 层的 AlexNet 。在两个网络结构完全相同的情况下,他发现使用了 LRN 层的AlexNet可以使top-1错误率有 1.4% 的降低,可以使 top-5 错误率有 1.2% 的降低。TensorFlow 提供了 nn.lrn()函数来实现 LRl证层的功能。对于 nn.lrn()函数,这里根据 Alex 论文中的推荐值设置 depth_radius=4,bias= 1 , alpha=0.001/9, beta=0 .75 。另外,在 AlexNet 之前的 CNN 普遍使用连续但不重叠的平均池化,但 AlexNet的池化层全部使用最大池化。先建立第一段卷积层,代码如下。
TensorFlow实现AlexNet卷积网络模型

接下来设计第二段卷积。这一层的卷积核大小变为了5×5 ,输入通道数为96,卷积核数量为256(卷积核数量也就是本层的输出通道数),同时卷积的步长也全部设为l ,意味着对图像进行全扫描。接下来对第二个卷积层的输出 conv2 进行处理,同样是先做LRN处理,再进行最大池化处理。代码如下:

TensorFlow实现AlexNet卷积网络模型
然后是第三层卷积层和第四层卷积层。第三层卷积的卷积操作使用的卷积核大小变为3×3,输入通道数为256,卷积核数量为 384,步长为1,同样意味着对图像进行全扫描。第四层卷积层的卷积操作使用的卷积核尺寸也是3 ×3,输入通道数为384,卷积核数量还是384,步长也全部设为1,也是对图像进行全扫描。这两层卷积层有一个共同的特点,那就是没有使用池化操作,也没有LRN操作,代码如下:

TensorFlow实现AlexNet卷积网络模型
接下来设计第五层卷积层。第五段卷积的卷积操作使用的卷积核尺寸同样是3 x3 ,输入通道数为 384,卷积核数量为 256,步长也全部设为 1 ,也是对图像进行全扫描。在第五层卷积层之后,增加了一个最大池化层(这个池化层和前两个卷积层后的池化层一致),但没有加入 LRN 层。至此,创建 AlexNet神经网络就构建完成了。代码如下:

TensorFlow实现AlexNet卷积网络模型
总结:这一讲我们讲述了如何使用TensorFlow去构建整个AlexNet神经网络,从第一层到最后一层,剖析每一层的代码实现以及实现的原理和解释,下一讲中,我们将讲述另一个经典的卷积神经网络模型——VGGNet,我们下期再见。

关注小鲸融创,一起深度学习金融科技!
TensorFlow实现AlexNet卷积网络模型