AlexNet — Krizhevsky et al
在2012年,Hinton的深度神经网络参加了世界上最重要的计算机视觉挑战赛imagenet,并将top-5损失从26%减少到15.3%,这一结果让世人惊艳。
这个神经网络跟LeNet很像,但是比它更深,有大概六千万的参数。
AlexNet — Architecture
这个计算过程看起来确实有点吓人。这是因为网络由两半组成,每一部分都在两块不同的GPU上进行训练。我们把这个过程说的容易点,用一个精简版的图来说明这个问题:
这个结构包括5个卷积层和3个全连接层。这八层也都采用了当时的两个新概念——最大池化和Relu激活来为模型提供优势。
你可以在上图中找到不同层及其相应的配置。每一层的描述如下表:
注:Relu激活函数被用在除了最后的softmax层的所有卷积层和全连接层的输出部分。
作者也使用了其他很多技术(不予以一一讨论)——比如dropout,augmentatio和动量随机梯度下降。
AlexNet — 代码
from keras import layers
from keras.models import Model
def alexnet(in_shape=(227,227,3), n_classes=1000, opt='sgd'):
in_layer = layers.Input(in_shape)
conv1 = layers.Conv2D(96, 11, strides=4, activation='relu')(in_layer)
pool1 = layers.MaxPool2D(3, 2)(conv1)
conv2 = layers.Conv2D(256, 5, strides=1, padding='same', activation='relu')(pool1)
pool2 = layers.MaxPool2D(3, 2)(conv2)
conv3 = layers.Conv2D(384, 3, strides=1, padding='same', activation='relu')(pool2)
conv4 = layers.Conv2D(256, 3, strides=1, padding='same', activation='relu')(conv3)
pool3 = layers.MaxPool2D(3, 2)(conv4)
flattened = layers.Flatten()(pool3)
dense1 = layers.Dense(4096, activation='relu')(flattened)
drop1 = layers.Dropout(0.5)(dense1)
dense2 = layers.Dense(4096, activation='relu')(drop1)
drop2 = layers.Dropout(0.5)(dense2)
preds = layers.Dense(n_classes, activation='softmax')(drop2)
model = Model(in_layer, preds)
model.compile(loss="categorical_crossentropy", optimizer=opt,
metrics=["accuracy"])
return model
if __name__ == '__main__':
model = alexnet()
print(model.summary())