AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。 这对于传统的机器学习分类算法而言,已经相当的出色。
(以下内容出自百度百科)
AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速。
AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:
(1)成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
(2)训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
(3)在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
(6)数据增强,随机地从256256的原始图像中截取224224大小的区域(以及水平翻转的镜像),相当于增加了2*(256-224)^2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
下边是Alex的tf实现过程(结合图片)
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model
inputs = tf.keras.Input(shape=(224,224,3))
#卷积核96个,尺寸(11,11),步长为4,输入维度为(224,224,3),输出维度:(224-11)/4+1=54,(54,54,96)
x = Conv2D(filters=96, kernel_size=(11,11),strides=4)(inputs)
#批标准化
x = BatchNormalization()(x)
x = Activation('relu')(x)
#最大池化,输出维度为(27,27,96)
x = MaxPool2D(pool_size = (3,3),strides=2)(x)
#padding=same,输出维度为(27,27,256)
x = Conv2D(filters=256, kernel_size=(5,5),padding='same',strides=1)(x)
#最大池化,输出维度为(13,13,256)
x = MaxPool2D(pool_size = (3,3),strides=2)(x)
#padding=same,输出维度为(13,13,384)
x = Conv2D(filters=384, kernel_size=(3,3),padding='same',strides=1)(x)
#padding=same,输出维度为(13,13,384)
x = Conv2D(filters=384, kernel_size=(3,3),padding='same',strides=1)(x)
#padding=same,输出维度为(13,13,256)
x = Conv2D(filters=256, kernel_size=(3,3),padding='same',strides=1)(x)
#最大池化,输出维度为(6,6,256)
x = MaxPool2D(pool_size = (3,3),strides=2)(x)
#连接全连接层前拉直
x = Flatten()(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
x = Dense(4096, activation='relu')(x)
x = Dropout(0.5)(x)
predictions = Dense(1000, activation='softmax')(x)
model = tf.keras.Model(inputs,predictions)
model.summary()
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 224, 224, 3)] 0
_________________________________________________________________
conv2d_25 (Conv2D) (None, 54, 54, 96) 34944
_________________________________________________________________
batch_normalization_5 (Batch (None, 54, 54, 96) 384
_________________________________________________________________
activation_5 (Activation) (None, 54, 54, 96) 0
_________________________________________________________________
max_pooling2d_15 (MaxPooling (None, 26, 26, 96) 0
_________________________________________________________________
conv2d_26 (Conv2D) (None, 26, 26, 256) 614656
_________________________________________________________________
max_pooling2d_16 (MaxPooling (None, 12, 12, 256) 0
_________________________________________________________________
conv2d_27 (Conv2D) (None, 12, 12, 384) 885120
_________________________________________________________________
conv2d_28 (Conv2D) (None, 12, 12, 384) 1327488
_________________________________________________________________
conv2d_29 (Conv2D) (None, 12, 12, 256) 884992
_________________________________________________________________
max_pooling2d_17 (MaxPooling (None, 5, 5, 256) 0
_________________________________________________________________
flatten_5 (Flatten) (None, 6400) 0
_________________________________________________________________
dense_15 (Dense) (None, 4096) 26218496
_________________________________________________________________
dropout_10 (Dropout) (None, 4096) 0
_________________________________________________________________
dense_16 (Dense) (None, 4096) 16781312
_________________________________________________________________
dropout_11 (Dropout) (None, 4096) 0
_________________________________________________________________
dense_17 (Dense) (None, 1000) 4097000
=================================================================
Total params: 50,844,392
Trainable params: 50,844,200
Non-trainable params: 192
_________________________________________________________________