VGG-19 是由牛津大學視覺幾何組和 Google DeepMind 的研究人員在 2014 年提出的一個非常經典的深度卷積神經網絡模型。
一 核心結構
(1)深度:?模型名稱中的 "19" 指的是模型擁有 19 層帶有權重的層(通常指:16 個卷積層 + 3 個全連接層 = 19。如果嚴格數帶參數的層,輸入層和 ReLU 激活層不計入深度統計)。
(2)簡單范式:?VGG 系列模型(包括 VGG-11, VGG-13, VGG-16, VGG-19)的核心思想非常簡單:只使用非常小的?3x3
?卷積核,并通過連續堆疊多個這樣的卷積層來構建一個很深的網絡。這種設計在保持相同感受野的同時,大大減少了參數量(相比大卷積核),并增加了網絡的深度和非線性。
(3)結構圖:
輸入圖像 (224x224x3 RGB)
-> 2 x [卷積 (3x3, 64)] -> 最大池化 (2x2) // Block 1
-> 2 x [卷積 (3x3, 128)] -> 最大池化 (2x2) // Block 2
-> 4 x [卷積 (3x3, 256)] -> 最大池化 (2x2) // Block 3
-> 4 x [卷積 (3x3, 512)] -> 最大池化 (2x2) // Block 4
-> 4 x [卷積 (3x3, 512)] -> 最大池化 (2x2) // Block 5
-> 3 x [全連接 (4096, 4096, 1000)] // FC Layers
-> Softmax -> 1000 類輸出概率
(4)激活函數:?所有卷積層和全連接層后都使用?ReLU (Rectified Linear Unit)?激活函數,這是深度學習中常見的非線性激活函數。
(5)池化層:?使用?2x2
?的最大池化層(Max Pooling),步長為 2,在每組卷積塊之后將特征圖的空間尺寸減半。總共有 5 次空間下采樣(池化)。
(6)全連接層:?在卷積部分之后,通常有兩個?4096
?單元的全連接層,最后是一個?1000
?單元(對應 ImageNet 的 1000 個類別)的輸出層。
二 模型特點
(1)深度有效:?通過堆疊多個小的?3x3
?卷積核,VGG-19 證明了增加網絡深度(層數)能顯著提升模型理解復雜視覺特征的能力。
(2)結構統一:?所有卷積層都使用相同的?3x3
?核大小(步幅為 1,填充為 1 以保持空間分辨率直到池化),設計非常一致且易于理解。
(3)參數量大:?VGG-19 是一個非常大的模型,擁有約?1.38 億個參數,主要集中在最后幾個全連接層。這使得它訓練和推理都非常耗費計算資源和內存。
(4)高精度 (At the time):?在 2014 年的 ImageNet 競賽中,VGG-19 展現出了當時最頂尖的識別精度。(雖然當年冠軍是 GoogLeNet/Inception-v1,但 VGG 因其結構簡單、效果顯著而極具影響力)
三 與之前版本的區別
以VGG-16(13 個卷積層 + 3 個全連接層)舉例:
VGG-16 和 VGG-19 的結構非常相似,主要區別在于?Block 3、4、5 中卷積層的數量:
Block 3, VGG-16 有 3 層卷積,VGG-19 有 4 層。
Block 4, VGG-16 有 3 層卷積,VGG-19 有 4 層。
Block 5, VGG-16 有 3 層卷積,VGG-19 有 4 層。
VGG-19 比 VGG-16 更深(多 3 個卷積層),參數量也略多(但量級都在 1.38 億附近)。精度通常略高于 VGG-16,但提升邊際效應遞減。
輸入圖像 (224x224x3 RGB)
-> 2 x [卷積 (3x3, 64)] -> 最大池化 (2x2) // Block 1
-> 2 x [卷積 (3x3, 128)] -> 最大池化 (2x2) // Block 2
-> 3 x [卷積 (3x3, 256)] -> 最大池化 (2x2) // Block 3
-> 3 x [卷積 (3x3, 512)] -> 最大池化 (2x2) // Block 4
-> 3 x [卷積 (3x3, 512)] -> 最大池化 (2x2) // Block 5
-> 3 x [全連接 (4096, 4096, 1000)] // FC Layers
-> Softmax -> 1000 類輸出概率
# VGG-16模型定義
class VGG16(nn.Module):def __init__(self, num_classes=10):super(VGG16, self).__init__()self.features = nn.Sequential(# Block 1nn.Conv2d(3, 64, kernel_size=3, padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.Conv2d(64, 64, kernel_size=3, padding=1),nn.BatchNorm2d(64),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 2nn.Conv2d(64, 128, kernel_size=3, padding=1),nn.BatchNorm2d(128),nn.ReLU(inplace=True),nn.Conv2d(128, 128, kernel_size=3, padding=1),nn.BatchNorm2d(128),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 3nn.Conv2d(128, 256, kernel_size=3, padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, padding=1),nn.BatchNorm2d(256),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 4nn.Conv2d(256, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# Block 5nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.Conv2d(512, 512, kernel_size=3, padding=1),nn.BatchNorm2d(512),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),)
四 VGG優缺點
優點 | 缺點 |
---|---|
?歷史貢獻:深度驗證 -?首創使用連續小卷積堆疊深度網絡 - 證明了網絡深度對性能的關鍵作用 | 參數量過大(主要缺陷) - 全連接層(FC)參數量爆炸: - FC1: 25088×4096 ≈?1.03億參數 - 總參數量高達?1.38億 |
結構統一性 - 僅用?3×3小卷積核?+?2×2最大池化 - 模塊化堆疊(64→128→256→512通道) | 計算資源消耗大 - 大量卷積+全連接導致: -?訓練/推理速度慢 - 顯存占用高(移動端難以部署) |
特征表達能力強大 - 深層網絡捕獲多尺度特征 - 特征通用性極優(適用于遷移學習) | 梯度問題 - 原始版本未用BN層(Batch Normalization) - 訓練易出現梯度消失/爆炸(需配合Dropout) |
廣泛遷移應用 - 預訓練特征成為早期CV任務標準骨干 - 如目標檢測、圖像風格遷移等 | 全連接冗余嚴重 - FC層參數占整體 >90% - 后發模型(如ResNet)用全局池化替代FC |
簡潔設計理念 - 架構規整透明,易于復現/改進 - 小卷積堆疊優于大核(更多非線性+更少參數) | 訓練成本高昂 - 需大數據集(ImageNet級)防止過擬合 - 對超參數敏感 |
VGG-19 盡管它取得了顯著的高精度,但因其龐大的參數量和計算開銷,在新模型設計和效率敏感的部署場景中已被 ResNet 等更現代的網絡結構所取代。但在圖像表示學習、遷移學習和理解深度網絡基礎方面,VGG-19 仍然是一個非常重要和經典的基準模型。?