當卷積神經網絡被提出來之後,我們一直想要探讨的問題就是卷積神經網絡的深度,深度越深代表模型越複雜,但是其訓練難度也會加大,那麼卷積神經網絡到底可以有多深,是不是越深越好。為此在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想要探索卷積神經網絡的深度到底可以有多深,是不是越深就越好,但是它的網絡結構還是順序的堆疊。