当卷积神经网络被提出来之后,我们一直想要探讨的问题就是卷积神经网络的深度,深度越深代表模型越复杂,但是其训练难度也会加大,那么卷积神经网络到底可以有多深,是不是越深越好。为此在2014年,由牛津大学计算机视觉组和DeepMind公司,提出了VggNet网络结构,这是一种结构层次比较深的卷积神经网络架构。
网络架构:
我们可以看到上图中的VggNet有六种结构,分别是:A、A-LRN、B、C、D、E,他们之间最大的区别就是连续卷积的次数,同时在A-LRN中使用到的LRN表示的是Local Response Normalization,也就是局部响应归一化层,在C中使用到了
1
×
1
1\times1
1×1卷积,这种结构的卷积主要的目的就是降低维度,减少计算参数,在之后的许多网络结构当中都使用到了
1
×
1
1\times1
1×1卷积。
下面在Tensorflow的环境下,搭建VggNet中的A级别的架构:
import tensorflow as tf
from tensorflow.keras import layers
# 输入层
input = layers.Input((224, 224, 3))
# 卷积层1
conv1 = layers.Conv2D(64, 3, 1, padding="same", activation="relu")(input)
pool1 = layers.MaxPool2D(3, 2, padding="valid")(conv1)
# 卷积层2
conv2 = layers.Conv2D(128, 3, 1, padding="same", activation="relu")(pool1)
pool2 = layers.MaxPool2D(3, 2, padding="valid")(conv2)
# 卷积层3
conv3 = layers.Conv2D(256, 3, 1, padding="same", activation="relu")(pool2)
conv3_2 = layers.Conv2D(256, 3, 1, padding="same", activation="relu")(conv3)
pool3 = layers.MaxPool2D(3, 2, padding="valid")(conv3_2)
# 卷积层4
conv4 = layers.Conv2D(256, 3, 1, padding="same", activation="relu")(pool3)
conv4_2 = layers.Conv2D(256, 3, 1, padding="same", activation="relu")(conv4)
pool4 = layers.MaxPool2D(3, 2, padding="valid")(conv4_2)
# 卷积层5
conv5 = layers.Conv2D(256, 3, 1, padding="same", activation="relu")(pool4)
conv5_2 = layers.Conv2D(256, 3, 1, padding="same", activation="relu")(conv5)
pool5 = layers.MaxPool2D(3, 2, padding="valid")(conv5_2)
# 展平
flatten = layers.Flatten()(pool5)
# 全连接层1
dense1 = layers.Dense(4096, activation="relu")(flatten)
# 全连接层2
dense2 = layers.Dense(4096, activation="relu")(dense1)
# 输出层
output = layers.Dense(1000, activation="softmax")(dense2)
# 产生模型
model = tf.keras.Model(inputs=input, outputs=output)
# 打印模型
print(model.summary())
我们可以看到VggNet的结构相比于LeNet-5以及AlexNet,它结构的深度更深,并且采用了连续卷积的结构(之前我们一般在一个卷积之后就会跟上一个池化层),同时它也采用了
1
×
1
1\times1
1×1的卷积。可以看出VggNet想要探索卷积神经网络的深度到底可以有多深,是不是越深就越好,但是它的网络结构还是顺序的堆叠。