AlexNet_v1:ImageNet Classification with Deep Convolutional Neural Networks
AlexNet在2012年的ILVSRC上获得了第一名。相比第二名,它的准确率提高了超过了10%。
一. AlexNet的创新点
1.数据增强。
对图像进行了随机裁剪,水平翻转。数据增强使得数据增加了(256-224)x(256-224)x2=2048倍。并且改变图片的RGB通道的强度。
2.ReLU激活函数
激活函数采用了ReLU,这样就不会出现tanh和sigmoid两端的饱和现象。能够缓梯度反向传播过程中的梯度消失问题。能够明显加速网络的收敛。
3.重叠池化
将正常池化(2x2 stride 2)改为重叠池化(3x3 stride 2)可以将top-1和top-5提高0.4%和0.3%
4.局部响应归一化(Local Response Normalization)
LRN有助于泛化,但是LRN的效果其实是有争议的。
LRN其实是和BatchNorm有点像。
LRN思想主要来自于生物学的“侧抑制”
注:后续的诸多研究已经表明,LRN层基本没用!
5.Dropout
在fc中应用dropout可以防止过拟合,它以一种很高效地方式结合多个不同的训练模型。
6.多GPU训练
AlexNet的GPU实现(cpu数据预处理,gpu模型计算),大大加快了模型的训练。
二. AlexNet的架构图
下图是ZFNet给出的AlexNet架构图(个人感觉这个更清晰):
AlexNet一共8层,5个conv层,3个fc层。
三. 一些具体细节
数据预处理
- rescaled the image such that the shorter side was of length 256.
- cropped out the central 256×256 patch from the resulting image.
- subtracting the mean activity over the training set from each pixel.
训练阶段的数据增强:
- 随机裁剪为224x224
- 水平随机翻转
- 对各个颜色通道进行随机抖动
预测阶段的数据增强:
- 裁剪出 four corner patches 和 central patch 共5个224x224
- 水平翻转
因此一张图像总共会产生10个patch,将10个patch的softmax层输出平均,进行预测
训练细节
随机梯度下降
batch size:128
momentum:0.9
weight decay:0.0005(作者说这个很重要)
参数初始化:作者将2、4、5层conv及fc的bias置为1
初始学习速率:0.01
验证损失不下降,就将学习速率除以10
epochs:90
以下是TF+Keras混合编写的AlexNet:
# 这里使用TF和TF.keras.layers实现,可以保证绝对的兼容性
# 其实TF内部tf.layers是一个和keras.layers类似的高层API,也很好用
import tensorflow as tf
keras = tf.keras
from tensorflow.python.keras.layers import Conv2D,MaxPool2D,Dropout,Flatten,Dense
def inference(inputs,
num_classes=1000,
dropout_keep_prob=0.5):
'''
Inference
inputs: a tensor of images
num_classes: the num of category.
is_training: set ture when it used for training
dropout_keep_prob: the rate of dropout during training
'''
x = inputs
# conv1
x = Conv2D(96, [11,11], 4, activation='relu', name='conv1')(x)
# lrn1
x = tf.nn