AlexNet相较于LeNet其网络层次更深并且是在两块GPU上进行训练,这样做的目的是为了提高运算的效率。但是本质上是和LeNet没什么区别,都是卷积层、池化层、全连接层的顺序堆叠。
网络架构:
从上图中,我们可以看到整个AlexNet的网络架构,以及它是如何在两块GPU上进行训练的,当到达一定的层次之后,两块GPU会进行交互,但是可以看到两个GPU上的模型基本上是一样的。下面,将在Tensorflow的环境下,使用单个GPU实现AlexNet的网络结构。
import tensorflow as tf
from tensorflow.keras import layers
# 输入层
input = layers.Input((224, 224, 3))
# 卷积层1
conv1 = layers.Conv2D(96, 11, 4, padding="valid")(input)
norm1 = layers.BatchNormalization()(conv1)
pool1 = layers.MaxPool2D(3, 2, padding="valid")(norm1)
# 卷积层2
conv2 = layers.Conv2D(256, 5, 1, padding="valid")(pool1)
norm2 = layers.BatchNormalization()(conv2)
pool2 = layers.MaxPool2D(3, 2, padding="valid")(norm2)
# 卷积层3
conv3 = layers.Conv2D(384, 3, 1, padding="valid")(pool2)
# 卷积层4
conv4 = layers.Conv2D(384, 3, 1, padding="valid")(conv3)
# 卷积层5
conv5 = layers.Conv2D(256, 3, 1, padding="valid")(conv4)
pool5 = layers.MaxPool2D(3, 2, padding="valid")(conv5)
# 展平
flatten = layers.Flatten()(pool5)
# 全连接层1
dense1 = layers.Dense(4096, activation="relu")(flatten)
# 全连接层2
dense2 = layers.Dense(4096, avtivation="relu")(dense1)
# 输出层
output = layers.Dense(1000, activation="softmax")(dense2)
# 产生模型
model = tf.keras.Model(inputs=input, outputs=output)
# 打印模型
print(model.summary())
我们可以看到AlexNet的网络结构相较于LeNet,它的网络结构的深度更深了,对后面的网络结构有很大的影响。但是可以看到,这仍然是一些卷积、池化、全连接层的顺序拼接,没有更加复杂的结构出现。