前言
本文主要CNN系列论文解读——AlexNet的简介、模型结构、参数计算、网络结构的代码实现等。原文发表于语雀文档,排版更好看,目录如下:
【论文解读】CNN深度卷积神经网络-AlexNet · 语雀www.yuque.com
更多CNN论文解读系列:
【论文解读】CNN深度卷积神经网络-AlexNet
【论文解读】CNN深度卷积神经网络-VGG
【论文解读】CNN深度卷积神经网络-Network in Network
【论文解读】CNN深度卷积神经网络-GoogLeNet
【论文解读】CNN深度卷积神经网络-ResNet
【论文解读】CNN深度卷积神经网络-DenseNet
有用的话,请点个赞哦:)
1.简介
最早将CNN用于图像分类领域的是90年代提出的LeNet,不过由于其效果并没有大幅领先传统的机器学习,故用的人比较少。 AlexNet是2012年论文《ImageNet Classification with Deep ConvolutionalNeural Networks》中提出的一种卷积神经网络结构,并在12年的ImageNet分类赛上以大幅优势领先第二名,从而使得深度卷积神经网络CNN在图像分类上的应用掀起一波热潮,除此以外AlexNet有很多开创的进展,譬如使用Relu激活函数大幅提升训练速度,采用了先进的Dropout,数据扩增,双GPU并行训练等。AlexNet成为后面卷积神经网络模型的效仿对象和标杆。
还有一点,论文中采取了一种新的正则化方法:局部响应归一化/正则化Local Respose Normalization(LRU)在之后被证明并无多少实际效果,故很少有应用,而Dropout的方式则得到了大规模的继承。
1.1 资源下载
【2012】【AlexNet】imagenet-classification-with-deep-convolutional-neural-networks.pdf
2.Abstract
Abstract
We trained a large, deep convolutional neural network to classify the 1.2 million high-resolution images in the ImageNet LSVRC-2010 contest into the 1000 different classes. On the test data, we achieved top-1 and top-5 error rates of 37.5% and 17.0% which is considerably better than the previous state-of-the-art. The neural network, which has 60 million parameters and 650,000 neurons, consists of five convolutional layers, some of which are followed by max-pooling layers,and three fully-connected layers with a final 1000-way softmax. To make training faster, we used non-saturating neurons and a very efficient GPU implementation of the convolution operation. To reduce overfitting in the fully-connected layers we employed a recently-developed regularization method called “dropout”that proved to be very effective. We also entered a variant of this model in the ILSVRC-2012 competition and achieved a winning top-5 test error rate of 15.3%,compared to 26.2% achieved by the second-best entry.
翻译
我们训练了一个大型的深度卷积神经网络,将ImageNet ILSVRC -2010竞赛中的120万幅高分辨率图像分类为1000个不同的类。在测试数据上,我们的分别top-1和top-5错误率分别为37.5%和17.0%,比之前的水平有了很大的提高。该神经网络有6000万个参数和65万个神经元,由5个卷积层(其中一些是Max pooling池化层)和3个全连接层(最后的1000路softmax层)组成。为了使训练更快,我们使用了非饱和神经元和一个非常高效的GPU卷积运算方式(p.s.使用了Relu和双路GPU)。为了减少全连通层的过拟合,我们采用了一种最近开发的正则化方法“Dropout”,该方法被证明是非常有效的。我们还在ILSVRC-2012比赛中加入了该模型的一个变体,并以top-5测试错误率15.3%获胜,而第二名则是26.2%。
3.网络结构
3.1 示意图
由于当年的GPU限制,使用的是两个GTX580双路并行的训练模式(GTX 580 GPU只有3GB的内存),且训练了5~6天才得到。论文中的网络结构图如下:
image现在的GPU可以训练足够大的CNN网络,这里合并一下,网络如下:
image3.2 layer设计
整个AlexNet网络共12层,包括输入层×1、卷积层×5、池化层×3、全连接层×3,示意图中隐藏了池化层。
第1层输入层: 输入为224×224×3 三通道的图像。
第2层Conv层: 输入为224×224×3,经过96个kernel size为11×11×3的filter,stride = 4卷积后得到shape为55×55×96的卷积层。P.S.个人猜测:这里(224-11)/4 + 1 = 54.25,为了不丢弃特征,故多滑动了一步为55,或者和双路GPU的设计有关?!按照论文中filter size和stride的设计,输入的图片尺寸应该为227×227×3。
第3层Max-pooling层: 输入为55×55×96,经Overlapping pooling(重叠池化)pool size = 3,stride = 2后得到尺寸为27×27×96 的池化层
第4层Conv层: 输入尺寸为27×27×96,经256个5×5×96的filter卷积,padding=same得到尺寸为27×27×256的卷积层
第5层池化层: 输入为27×27×256,,经pool size = 3,stride = 2的重叠池化,得到尺寸为13×13×256的池化层。
第6~8层Conv层: 第6层输入为13×13×256,经384个3×3×256的filter卷积得到13×13×384的卷积层。 第7层输入为13×13×384,经384个3×3×384的filter卷积得到13×13×384的卷积层。 第8层输入为13×13×384,经256个3×3×384的filter卷积得到13×13×256的卷积层。 这里可见,这三层卷积层使用的kernel前两个维度都是3×3,只是通道维不同。
第9层Max-pooling层: 输入尺寸为13×13×256,经pool size = 3,stride = 2的重叠池化得到尺寸为6×6×256的池化层。该层后面还隐藏了flatten操作,通过展平得到9216个参数后与之后的全连接层相连。
第10~12层Dense层: 第10~12层神经元个数分别为4096,4096,1000。其中前两层在使用relu后还使用了Dropout对神经元随机失活,最后一层全连接层用softmax输出1000个分类。
3.3参数计算
根据论文描述,AlexNet中有65万个神经元,包括了6000万个参数。下面我们进行参数计算,由于池化层不涉及参数计算,我们重点关注5个卷积层和最后3个全连接层。
image4.论文解读
1. 介绍
得益于GPU的发展,我们可以构建大尺寸的CNN网络,而且当数据集规模和GPU能力更强时,训练效果会更好;最终的AlexNet网络包含5个卷积层和3个全连接层,这个深度很重要:去掉任何卷积层(每个不超过模型参数的1%)都会导致性能表现低下。
2. 数据集
这一节介绍了ImageNet数据集和ILSVRC的来源。ImageNet是一个包含超过1500万张高分辨率图像的数据集,属于大约22000个类别。这些图片是从网上收集来的,并由人工贴标签者使用Amazon的土耳其机器人众包工具进行标记。从2010年开始,作为Pascal Visual Object Challenge的一部分,每年都会举办一场名为ImageNet大型视觉识别挑战赛(ILSVRC)的比赛。ILSVRC使用ImageNet的一个子集,每个类别大约有1000张图片。总共大约有120万张训练图像、5万张验证图像和15万张测试图像。
3. 网络结构The Architecture
3.1 非线性Relu
比较了在CIFAR-10数据集下,一个4层卷积的网络结构,在以tanh和relu作为激活单元时损失和训练轮数的关系,得出结论:使用ReLUs进行深度卷积神经网络训练的速度比使用tanh训练的速度快几倍
image3.2 多GPU并行训练
论文中展示的多GPU并行训练是在当时GPU的内存较小的情况下,采用的无奈操作,得益于现在GPU内存的高速发展,此类操作如今没有使用的必要了。
3.3 LRN
论文中提出,采用LRN局部响应正则化可以提高模型的泛化能力,所以在某些层应用了ReLU后,加上了LRN使得top-1和top-5的错误率分别降低了1.4%和1.2%。但是由于实际作用不大,后面LRN的方式并没有被人们广泛使用 3.4 Overlapping Pooling 论文中的Maxpooling采用的是重叠池化,传统池化时卷积核提取的每一小块特征不会发生重合,譬如kernel size记为z×z,步长stride记为s,当z = s时,就不会发生重合,当z > s时,就会发生重合,即重叠池化。AlexNet训练中的stride为2,kernel size为z = 3,使用的就是重叠池化。 **
4. 降低过拟合
4.1 数据扩增
为了降低过拟合,提高模型的鲁棒性,这里采用了两种Data Augmentation数据扩增方式:
- 1.生成图像平移和水平反射。通过从256×256幅图像中提取随机224×224块图像(及其水平反射),并在这些提取的图像上训练我们的网络。这将我们的训练集的大小增加了2048倍
- 2.改变了训练图像中RGB通道的强度。在整个imagenet训练集中对RGB像素值集执行PCA操作
4.2 Dropout
训练采用了0.5丢弃率的传统Dropout,对于使用了Dropout的layer中的每个神经元,训练时都有50%的概率被丢弃。所以每次输入时,神经网络都会对不同的结构进行采样,但是所有这些结构都共享权重。这种技术减少了神经元之间复杂的相互适应,因为神经元不能依赖于其他神经元的存在。因此,它被迫获得更健壮的特征。测试时使用所有的神经元,但将它们的输出乘以0.5。 论文中还提到了:Dropout使收敛所需的迭代次数增加了一倍
5.学习细节
训练使用的是小批量随机梯度下降,batch size = 128,动量momentum为0.9,weight deay权重衰减为0.0005;每一层的权重初始化为均值1标准差0.01的正态分布,在第2,4,5卷积层和全连接层中的bias初始化为常数1,其余层则为0.所有层采用了相同的初始化为0.01的学习率,不过可以手动调整。整个训练过程在两台NVIDIA GTX 580 3GB gpu上用了5到6天的时间,120万张图像的训练集,大约90轮迭代。 论文中提到:weight deay对模型的学习很重要。换句话说,这里的重量衰减不仅仅是一个正则化器:它减少了模型的训练误差。
7.讨论
论文中指出:一个大型的、深度的卷积神经网络能够在一个高度挑战的数据集上使用纯监督学习获得破纪录的结果。如果去掉AlexNet网络中的任意个卷积层,整体性能就会下降约2%,可见,网络的深度很重要。
5.代码实现
这里使用tensorflow2.0实现网络结构,而不是完整的训练。
import tensorflow as tf
# tf版本为2.0.0
net = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=96, kernel_size=11, strides=4, activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
tf.keras.layers.Conv2D(filters=256, kernel_size=5, padding='same', activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(filters=384, kernel_size=3, padding='same', activation='relu'),
tf.keras.layers.Conv2D(filters=256, kernel_size=3, padding='same', activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3, strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(4096, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(4096, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(1000, activation='softmax')
])
# 输出每一层的shape
X = tf.random.uniform((1,227,227,3)) # 这里为了演示正确,输入改为227而不是论文中的224
for layer in net.layers:
X = layer(X)
print(layer.name, 'output shape\t', X.shape)
输出:
conv2d output shape (1, 55, 55, 96)
max_pooling2d output shape (1, 27, 27, 96)
conv2d_1 output shape (1, 27, 27, 256)
max_pooling2d_1 output shape (1, 13, 13, 256)
conv2d_2 output shape (1, 13, 13, 384)
conv2d_3 output shape (1, 13, 13, 384)
conv2d_4 output shape (1, 13, 13, 256)
max_pooling2d_2 output shape (1, 6, 6, 256)
flatten output shape (1, 9216)
dense output shape (1, 4096)
dropout output shape (1, 4096)
dense_1 output shape (1, 4096)
dropout_1 output shape (1, 4096)
dense_2 output shape (1, 1000)
在《动手学深度学习》-tf2.0版一书中,有完整的训练代码。不过由于ImageNet规模较大,故数据集使用的是Fashion-MNIST,完整训练可参考:深度卷积神经网络(AlexNet)
6.总结
- 1.AlexNet和LeNet设计上有一脉相承之处,也有区别。为了适应ImageNet中大尺寸图像,其使用了大尺寸的卷积核,从11×11到5×5到3×3,AlexNet的卷积层和全连接层也带来更多的参数6000万(LeNet只有6万),这一全新设计的CNN结构在图像分类领域取大幅超越传统机器学习,自此之后CNN在图像分类领域被广泛应用。
- 2.使用了Relu替换了传统的sigmoid或tanh作为激活函数,大大加快了收敛,减少了模型训练耗时。
- 3.使用了Dropout,提高了模型的准确度,减少过拟合,这一方式再后来也被广泛采用。
- 4.使用数据了2种数据扩增技术,大幅增加了训练数据,增加模型鲁棒性,减少过拟合。
- 5.使用了LRN正则化、多GPU并行训练的模式(不过之后并没有被广泛应用)
网友评论