继LeNet之后,卷积网络沉寂了14年。直到2012年,AlexNet在ILSVRC2010一举夺魁,将图片分类的精度提高了10个百分点。
AlexNet是一个教科书式的网络,相比对LeNet来说,AlexNet大大增加了神经网络的宽度和深度,也得益于计算能力的提高,网络的可学参数达到了千万级别。
AlexNet
AlexNet的几个特别之处:
- 更宽更深的网络
- 卷积层激活函数采用relu,防止梯度消失,一定程度缓解过拟合问题
- 池化层采用overlap pooling,strides小于pool_size。论文中说可缓解过拟合
- 卷积层之后进行归一化
- dropout,缓解过拟合
Dropout的使用方法是在训练过程中随机将一定比例的隐层节点置0,Dropout能够缓解过拟合的原因是每次训练都会采样出一个不同的网络架构,但是这些结构是共享权值的。这种技术减轻了节点之间的耦合性,因为一个节点不能依赖网络的其它节点。因此,节点能够学习到更健壮的特征,因为只有这样,节点才能适应每次采样得到的不同的网络结构。在测试时,我们是不对节点进行Drop的。
使用keras实现代码:
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout
from keras.layers.normalization import BatchNormalization
from keras.optimizers import SGD
from keras.utils import plot_model, to_categorical
import matplotlib.pyplot as plt
model = Sequential()
# relu激活函数不会产生梯度消失现象,一定程度缓解过拟合问题
model.add(Conv2D(input_shape=(277, 277, 3), strides=4, filters=96, kernel_size=(11, 11), padding='valid', activation='relu'))
model.add(BatchNormalization()) #归一化
#overlap pooling:步长小于pooling核。论文中说可以减轻过拟合
model.add(MaxPool2D(pool_size=(3, 3), strides=2))
model.add(Conv2D(filters=256, kernel_size=(5, 5), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=(3, 3), strides=2))
model.add(Conv2D(filters=384, kernel_size=(3, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters=384, kernel_size=(3, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(filters=256, kernel_size=(3, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPool2D(pool_size=(2, 2), strides=2))
model.add(Flatten())
model.add(Dense(4096, activation='tanh'))
model.add(Dropout(0.5)) # 缓解过拟合
model.add(Dense(4096, activation='tanh'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.summary()
可视化
from keras.utils.vis_utils import plot_model
from IPython.display import Image
plot_model(model, to_file="AlexNet.png", show_shapes=True)
Image('AlexNet.png')