人工智能-python-深度學習-神經網絡VGG(詳解)

LeNet 系列之后 —— VGG(詳解):從原理到 PyTorch 實現

文章目錄

  • LeNet 系列之后 —— **VGG(詳解)**:從原理到 PyTorch 實現
    • 1. VGG 的發展歷史與意義(一句話+背景)
    • 2. VGG 的核心思想(要點)
    • 3. VGG 的主要版本(配置)
    • 4. **逐層結構詳解 + 逐層計算舉例(以 VGG-16 為例)**
      • 4.1 形狀變化公式(卷積/池化常用公式)
      • 4.2 參數數量計算公式
      • 4.3 逐層數值舉例(VGG-16,輸入:`3 × 224 × 224`)
      • 4.4 感受野(receptive field)直觀說明
    • 5. 關鍵設計點解析(深入)
    • 6. PyTorch 實現
      • A. 直接用 torchvision(推薦做遷移學習)
      • B. 自定義 VGG-16(配置 D)的實現
      • 訓練/微調的示例骨架(CIFAR-10)
    • 7. 訓練與評估(超參、訓練曲線、結果呈現建議)
      • 建議超參數(可作為 baseline)
      • 訓練曲線繪制(示例)
      • 示例結果(說明)
    • 8. 實驗擴展(對比/消融實驗建議)
    • 9. 總結與實踐建議

標題:VGG 神經網絡(詳解)—— 原理、逐層計算、PyTorch 實現與實驗指南
簡介:VGG(Visual Geometry Group)由 Simonyan & Zisserman 在 2014 年提出,主張用統一的小卷積核(3×3)堆疊并加深網絡,取得了 ImageNet 上的優秀效果。本文目標是把 VGG 的思想、結構、逐層維度/參數計算以及一個可跑通的 PyTorch 示例講清楚



1. VGG 的發展歷史與意義(一句話+背景)

  • 一句話:VGG 提出“把網絡加深并統一用小卷積核(3×3)”的設計思想,證明了深度(depth)在卷積網絡表征能力上的重要性。
  • 背景/成績:VGG 的模型(其兩個最優模型)在 ILSVRC2014 的分類/定位任務中取得了非常靠前的結果(classification 與 localization 分別取得優異名次)。在 ILSVRC2014 上,GoogLeNet 為第一名,VGG 的提交在分類賽道上名列前茅(ensemble/top5 ~7.3% 左右),在定位上也表現很好。([image-net.org][1])

2. VGG 的核心思想(要點)

  • 非常小的卷積核(3×3)并多層堆疊:用許多 3×3 卷積替代單個大核(例如 7×7),既能增加網絡深度,也能用更少的參數獲得更復雜的非線性。論文中闡明:兩層 3×3 的堆疊擁有等效的 5×5 感受野,三層 3×3 等效 7×7。
  • 統一的設計范式:每個 block 中重復 “(conv3×3 → ReLU)” 若干次,再做 2×2 max-pool 下采樣;每個 block 的通道數在下采樣后翻倍(64→128→256→512)。
  • 深度優先:通過把“寬度”控制在中等,重點增加“深度”,提升表達能力。
  • 簡單實用:統一且模塊化,便于移植、遷移學習與微調。現成的預訓練權重也廣泛可得(PyTorch/torchvision 等)。([PyTorch Docs][2])

3. VGG 的主要版本(配置)

論文中給出幾種配置(A–E);常見編號對應為:

  • VGG-11 (A)
  • VGG-13 (B)
  • VGG-16 (D,最常見,常說的 VGG16)
  • VGG-19 (E)

各配置差異主要在每個 block 內 conv 層的個數(例如 VGG16 每個 block 的 conv 層數為 2/2/3/3/3)。更多細節見論文配置表。


4. 逐層結構詳解 + 逐層計算舉例(以 VGG-16 為例)

4.1 形狀變化公式(卷積/池化常用公式)

  • 卷積輸出寬/高計算(單層):

    Hout=?Hin?K+2PS?+1H_{out} = \left\lfloor\frac{H_{in} - K + 2P}{S}\right\rfloor + 1 Hout?=?SHin??K+2P??+1

    其中 KKK 為核大小(例如 3),PPP 為 padding,SSS 為 stride。VGG 全部 conv 使用 K=3, P=1, S=1,因此空間尺度 保持不變

  • 池化(2×2, stride=2)會將寬高各除以 2:Hout=Hin/2H_{out} = H_{in}/2Hout?=Hin?/2

4.2 參數數量計算公式

  • 卷積層參數(含偏置):

    params=Cin×Cout×K×K(+Coutbiases)\text{params} = C_{in} \times C_{out} \times K \times K \; (+\; C_{out}\ \text{biases}) params=Cin?×Cout?×K×K(+Cout??biases)

  • 全連接層參數(含偏置):

    params=Nin×Nout(+Noutbiases)\text{params} = N_{in} \times N_{out} \; (+\; N_{out}\ \text{biases}) params=Nin?×Nout?(+Nout??biases)

4.3 逐層數值舉例(VGG-16,輸入:3 × 224 × 224

下面表格列出每層的輸入/輸出尺寸以及該層參數(含 bias)。(注:padding=1, stride=1 的 3×3 conv;池化 2×2 stride=2)

層名類型輸入輸出參數量(含 bias)
conv1_1conv 3→64 (3×3)3×224×22464×224×2241,792 (1728 + 64)
conv1_2conv 64→6464×224×22464×224×22436,928
pool1maxpool 2×264×224×22464×112×1120
conv2_1conv 64→12864×112×112128×112×11273,856
conv2_2conv 128→128128×112×112128×112×112147,584
pool2maxpool128×112×112128×56×560
conv3_1conv 128→256128×56×56256×56×56295,168
conv3_2conv 256→256256×56×56256×56×56590,080
conv3_3conv 256→256256×56×56256×56×56590,080
pool3maxpool256×56×56256×28×280
conv4_1conv 256→512256×28×28512×28×281,180,160
conv4_2conv 512→512512×28×28512×28×282,359,808
conv4_3conv 512→512512×28×28512×28×282,359,808
pool4maxpool512×28×28512×14×140
conv5_1conv 512→512512×14×14512×14×142,359,808
conv5_2conv 512→512512×14×14512×14×142,359,808
conv5_3conv 512→512512×14×14512×14×142,359,808
pool5maxpool512×14×14512×7×70
flatten512×7×7250880
fc1FC 25088→4096250884096102,764,544
fc2FC 4096→40964096409616,781,312
fc3FC 4096→1000409610004,097,000
  • 總參數量(VGG-16)138,357,544(約 138M)。可以看到 絕大部分參數來源于前兩層 FC(尤其是第一個 FC)。這就是為什么全連接層往往是參數與存儲瓶頸。數據來源與論文表格一致。

4.4 感受野(receptive field)直觀說明

  • 單個 3×3 卷積的感受野是 3×3;兩個 3×3 連著(無下采樣)對原圖的等效感受野是 5×5;三個 3×3 等效為 7×7。直觀上,第二層卷積核“看”到的是前一層 3×3 的特征,而這些特征本身對應原始圖像上的 3×3 區域,合并后等價于更大的窗口,但通過兩次非線性(ReLU)增強了表達能力。

5. 關鍵設計點解析(深入)

  • 為什么用 3×3 而不是 7×7/11×11?

    • 參數效率:用三個 3×3 的層實現 7×7 的等效感受野,但參數更少;例如單個 7×7(輸入 c, 輸出 d)參數為 c×d×7×7c \times d \times 7 \times 7c×d×7×7,而三個 3×3 的組合參數為 c×m×3×3+m×n×3×3+n×d×3×3c\times m\times3\times3 + m\times n\times3\times3 + n\times d\times3\times3c×m×3×3+m×n×3×3+n×d×3×3(若中間通道數相同可更便宜),并且中間層帶非線性,表達更豐富。論文對這一點做了論證。
  • ReLU:使用 ReLU 作為非線性,訓練收斂快且減少了梯度消失問題(當時為常用選擇)。

  • FC 層大且昂貴:VGG 的 FC 層占參數大頭(約 90%+),是模型存儲的瓶頸。后來很多工作(例如全局平均池化、去掉大 FC)用來做模型輕量化。

  • BN(批歸一化):在后續實踐中,VGG-BN(在 conv 后加 BN)能顯著加速訓練并提升穩定性;PyTorch/torchvision 提供 vgg16_bn。([PyTorch Docs][3])


6. PyTorch 實現

下面給出兩個版本:(A)直接使用 torchvision 的預訓練模型(最簡單)(B)自定義實現 VGG-16 的代碼(用于教學/修改)。二者都附訓練/微調的骨架。

A. 直接用 torchvision(推薦做遷移學習)

# 直接加載 torchvision 預訓練 VGG16,并替換最后的分類頭(示例:用于 CIFAR-10)
import torch
import torch.nn as nn
from torchvision import modelsdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 加載預訓練權重(PyTorch >= 0.13 的新 API 以 weights 參數為準)
vgg = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1)  # 或 weights='IMAGENET1K_V1'
# 替換 classifier 的最后一層為 10 類(CIFAR-10)
vgg.classifier[-1] = nn.Linear(in_features=4096, out_features=10)
vgg = vgg.to(device)

如果你的 PyTorch 版本沒有 weights 參數,用 pretrained=True(老版本)。

B. 自定義 VGG-16(配置 D)的實現

# 教學用:手寫 VGG-16 的構建函數(簡化版,不含 BN)
import torch.nn.functional as F
import torchdef make_vgg_layers(cfg):layers = []in_channels = 3for v in cfg:if v == 'M':layers += [nn.MaxPool2d(kernel_size=2, stride=2)]else:layers += [nn.Conv2d(in_channels, v, kernel_size=3, padding=1),nn.ReLU(inplace=True)]in_channels = vreturn nn.Sequential(*layers)# cfg for VGG-16 (D)
cfg_D = [64, 64, 'M',128, 128, 'M',256, 256, 256, 'M',512, 512, 512, 'M',512, 512, 512, 'M']class VGG16Custom(nn.Module):def __init__(self, num_classes=1000, init_weights=True):super().__init__()self.features = make_vgg_layers(cfg_D)self.classifier = nn.Sequential(nn.Linear(512*7*7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, num_classes))if init_weights:self._initialize_weights()def forward(self, x):x = self.features(x)x = torch.flatten(x, 1)x = self.classifier(x)return xdef _initialize_weights(self):for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):nn.init.normal_(m.weight, 0, 0.01)nn.init.constant_(m.bias, 0)# 使用舉例
model = VGG16Custom(num_classes=10).to(device)

訓練/微調的示例骨架(CIFAR-10)

# 訓練骨架(略去數據加載細節)
import torch.optim as optim
from torch.optim import lr_schedulercriterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=5e-4)
scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)  # 每 30 epoch lr*0.1num_epochs = 50
for epoch in range(num_epochs):model.train()for imgs, labels in train_loader:imgs, labels = imgs.to(device), labels.to(device)optimizer.zero_grad()outputs = model(imgs)loss = criterion(outputs, labels)loss.backward()optimizer.step()scheduler.step()# 驗證部分省略:計算 val_loss / val_acc 并記錄用于作圖

數據增強(CIFAR-10 推薦):RandomCrop(32, padding=4), RandomHorizontalFlip(), Normalize(mean,std)
PyTorch 官方 vgg16 / vgg16_bn 的細節參見 torchvision 文檔。([PyTorch Docs][2])


7. 訓練與評估(超參、訓練曲線、結果呈現建議)

建議超參數(可作為 baseline)

  • dataset:CIFAR-10(演示)或 ImageNet(實際訓練需大量資源)
  • batch_size:128(顯存允許越大越穩)
  • optimizer:SGD(momentum=0.9)或 Adam(調參)
  • lr:0.01(SGD)或 1e-3(Adam),配合 lr scheduler(StepLR / CosineAnnealing)
  • weight_decay:5e-4(控制過擬合)
  • epochs:50–200(視數據集大小而定)
  • 數據增強:隨機裁剪、水平翻轉、顏色抖動(視情況)

訓練曲線繪制(示例)

  • 每 epoch 記錄 train_loss, val_loss, train_acc, val_acc,使用 matplotlib 繪圖:
import matplotlib.pyplot as plt
plt.figure()
plt.plot(epochs, train_losses, label='train_loss')
plt.plot(epochs, val_losses, label='val_loss')
plt.legend(); plt.xlabel('epoch'); plt.ylabel('loss')
  • 典型現象:train_loss 下降,val_loss 在開始下降后趨于平穩或上升(過擬合)→ 可加入更多增強/減小 FC/加 BN/用 dropout。

示例結果(說明)

  • 說明:我無法在這里替你訓練模型拿到具體曲線,但用上面的超參和 CIFAR-10 數據增強,VGG-16(做遷移學習或從頭訓練)通常能達到 約 90%+ 的 top-1 準確率(取決于訓練時長與增強策略)。如果需要,我可以給出一個更精確的訓練腳本和繪圖代碼(但當前回答包含了足夠骨架,讓你直接運行)。(注:不同實現/數據預處理會影響最終數值)

8. 實驗擴展(對比/消融實驗建議)

若想在文章里做小實驗來展示設計選擇的影響,這里給出常見對比項與預期結論:

  1. 3×3 堆疊 vs 大核(5×5 / 7×7)

    • 實驗:用 2×3×3 替代 1×5×5,或用單 7×7 替代三 3×3;比較參數、準確率與訓練收斂速度。
    • 預期:堆疊小核在參數相近或更少的情況下表現更好(且非線性更多)。
  2. ReLU vs LeakyReLU / ELU

    • 實驗:把所有 ReLU 替換為 LeakyReLU,比較收斂和最后精度。
    • 預期:對大多數任務 ReLU 是穩健選擇,其他激活在特定任務上可能有微小提升。
  3. MaxPool vs AvgPool

    • 實驗:把每個 max-pool 換成 avg-pool,或用 stride=2 卷積實現下采樣。
    • 預期:max-pool 通常保留更銳利的特征(分類任務常更優);avg-pool 可以在某些特征統計任務上更穩定。
  4. BatchNorm(VGG_BN)

    • 實驗:VGG-16 與 VGG-16-BN 對比(相同 lr/optimizer),觀察收斂速度與最終精度。
    • 預期:BN 能顯著加速訓練并提高穩定性(更容易用較大學習率訓練)。PyTorch 的 vgg16_bn 可直接使用。([PyTorch Docs][3])
  5. 數據增強(與否)

    • 實驗:無增強 / 基礎增強 / 強增強(Cutout, Mixup)對比。
    • 預期:合理增強能顯著提高泛化與 val 精度,尤其在小數據集上效果明顯。

9. 總結與實踐建議

  • VGG 的價值不僅在于當時的比賽成績,更在于它提出并驗證了“深層 + 小卷積核”的設計范式(簡單、統一、易遷移),對后續網絡設計影響深遠(ResNet/Inception 等都是在這類設計基礎上進一步改進)。
  • 如果你資源有限:優先使用預訓練的 VGG 并做微調(替換最后一層 / 凍結前幾層),而不是從頭訓練 ImageNet。PyTorch torchvision 提供了便捷的接口與權重。([PyTorch Docs][2])
  • 若關注模型輕量化或部署效率:考慮移除大 FC 層(換成 GAP)或改用更現代且輕量的 backbone(ResNet / MobileNet / EfficientNet 等)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98420.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

光伏運維迎來云端革命!AcrelCloud-1200如何破解分布式光伏四大痛點?

在國家“雙碳”目標推動下,分布式光伏正迎來爆發式增長🌞。甘肅、吉林、云南等多地政策接連落地,整縣推進屋頂光伏試點如火如荼!然而,快速發展的背后,你是否也遇到過這些“光伏運維之痛”??【痛…

將 maven 集成到 idea 后出現 向項目創建模塊時出錯:null 的問題

1.出現的問題今天想將maven繼承到idea出現了一下問題:用生成器里面的也會報錯,找了找帖子并沒有哪位大佬出現類似錯誤,于是我解決完想分享一下,如果有不對,請指正。2.解決辦法很可能是java 的 版本 與 maven 版本有問題…

類似于 Progress Telerik Fiddler Classic 的 免費 或 開源 HTTP/HTTPS 抓包與調試工具推薦

以下是一些 類似于 Progress Telerik Fiddler Classic 的 免費 或 開源 HTTP/HTTPS 抓包與調試工具推薦:免費 / 開源替代工具推薦 1. Wireshark 免費且開源的網絡協議分析工具,支持 Windows、macOS、Linux 等平臺。可捕獲并深入分析網絡流量,…

7.0 熱電偶的工作原理

在工業生產過程中,溫度是需要測量和控制的重要參數之一。在溫度測量中,熱電偶的應用極為廣泛,它具有結構簡單、制造方便、測量范圍廣、精度高、慣性小和輸出信號便于遠傳等許多優點。另外,由于熱電偶是一種無源傳感器,…

commons-lang3

概述 提供了許多幫助程序實用程序&#xff0c;特別是字符串操作方法&#xff0c;基本數值方法&#xff0c;對象反射&#xff0c;并發&#xff0c;創建和序列化以及系統屬性。maven依賴<dependency><groupId>org.apache.commons</groupId><artifactId>c…

vue-amap組件呈現的效果圖如何截圖

我們用amap呈現了幾個圖層后&#xff0c;用戶覺得效果很好&#xff0c;想點個按鈕直接將這個畫面截圖下來。 首先我們用Canvas的toDataURL方法可以直接獲取圖像數據&#xff0c;但是實踐發現截圖后是空白的。 原因在警告中&#xff1a; 地圖的WebGL context 的preserveDrawin…

杰理燒錄ERROR: Data error after erasing, address = 0x430000

把CONFIG_BOARD_DEV_KIT關閉&#xff0c;打開CONFIG_BOARD_DEVELOP

超越自動化:為什么說供應鏈的終局是“AI + 人類專家”的混合智能?

摘要&#xff1a;當前&#xff0c;圍繞AI賦能供應鏈的討論&#xff0c;大多聚焦于“自動化”帶來的降本增效。然而&#xff0c;這僅僅是第一層。當我們的系統面對“黑天鵝”事件時&#xff0c;一個過度依賴自動化的“脆弱”系統可能會瞬間崩潰。本文旨在深入探討供應鏈演進的下…

Spine文件導入Unity流程

1、轉為Json文件導出 2、對文件進行處理 3、添加Spine的Package包 一、Spine文件導出設置 1、選擇Json文件 2、選擇導出所在路徑 3、點擊打包設置 更改圖集擴展名 二、文件導出后的設置 1、修改Json的Spine版本 這里必須是3.8 三、下載Unity支持包 1、鏈接 spine-unit…

Docker Compose healthcheck介紹(監控容器中服務的實際健康狀態)數據庫健康檢查pg_isready

文章目錄**功能概述****核心參數詳解****配置示例****1. 基礎用法****2. 使用數據庫健康檢查****3. 結合 depends_on 控制啟動順序****高級用法****1. 自定義健康檢查腳本****2. 多種健康檢查類型**- **HTTP 檢查**&#xff1a;- **TCP 端口檢查**&#xff1a;- **Redis 檢查**…

算法之雙指針

在算法設計中&#xff0c;雙指針是一種高效優化工具&#xff0c;主要用于線性數據結構&#xff08;如數組&#xff08;數組劃分和數組分塊常用&#xff09;、鏈表、字符串&#xff09;&#xff0c;通過控制兩個指針的移動軌跡&#xff0c;將原本需要 O (n) 時間復雜度的問題優化…

冪等性、順序性保障以及消息積壓

冪等性 概念 在應用程序中&#xff0c;冪等性就是指對一個系統進行重復調用&#xff08;相同參數&#xff09;&#xff0c;不論請求多少次&#xff0c;這些請求對系統的影響都是相同的效果. 比如數據庫的select操作.不同時間兩次查詢的結果可能不同&#xff0c;但是這個操作…

算法訓練營DAY58 第十一章:圖論part08

拓撲排序精講 卡碼網&#xff1a;117. 軟件構建(opens new window) 題目描述&#xff1a; 某個大型軟件項目的構建系統擁有 N 個文件&#xff0c;文件編號從 0 到 N - 1&#xff0c;在這些文件中&#xff0c;某些文件依賴于其他文件的內容&#xff0c;這意味著如果文件 A 依…

如何在Python中使用正則表達式?

在Python中使用正則表達式主要通過內置的re模塊實現。正則表達式用于匹配、查找、替換字符串中的特定模式&#xff0c;是處理文本的強大工具。以下是使用正則表達式的核心方法和示例&#xff1a; 一、基本用法步驟 導入re模塊&#xff1a;import re定義正則表達式模式&#xff…

用 Trae 玩轉 Bright Data MCP 集成

引言 在自動化與智能體浪潮中&#xff0c;Trae 以“開箱即用、所見即所得”的工具編排體驗&#xff0c;成為個人與團隊落地 AI 工作流的高效選擇。本篇將以 Trae 為主角&#xff0c;展示如何通過最少配置完成與 Bright Data MCP 的對接&#xff0c;并快速構建一個可用、可觀測…

大數據Spark(六十三):RDD-Resilient Distributed Dataset

文章目錄 RDD-Resilient Distributed Dataset 一、RDD五大特性 二、RDD創建方式 RDD-Resilient Distributed Dataset 在 Apache Spark 編程中&#xff0c;RDD&#xff08;Resilient Distributed Dataset&#xff0c;彈性分布式數據集&#xff09;是 Spark Core 中最基本的數…

java,通過SqlSessionFactory實現動態表明的插入和查詢(適用于一個版本一個表的場景)

1,測試實體類package org.springblade.sample.test;import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data;/*** Author: 肖揚* CreateTime: 2025-09-05* Description: SqlSessionFactoryTest測試* Version: 1.0*/ Data TableName("session_factory_…

鷓鴣云光儲流程系統全新升級:視頻指引與分階段模塊使用指南

鷓鴣云光儲流程系統近日完成重要更新&#xff0c;全面優化了操作指引體系&#xff0c;為用戶帶來更高效、直觀的使用體驗。本次升級重點推出了全套功能操作視頻&#xff0c;并明確了不同業務階段的核心模塊使用指南&#xff0c;助力用戶快速上手、提升工作效率。全覆蓋視頻操作…

ChatGPT 協作調優:把 SQL 查詢從 5s 優化到 300ms 的全過程

ChatGPT 協作調優&#xff1a;把 SQL 查詢從 5s 優化到 300ms 的全過程 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個…

復雜計算任務的智能輪詢優化實戰

目錄 復雜計算任務的智能輪詢優化實戰 一、輪詢方法介紹 二、三種輪詢優化策略 1、用 setTimeout 替代 setInterval 2、輪詢時間指數退避 3、標簽頁可見性檢測&#xff08;Page Visibility API&#xff09; 三、封裝一個簡單易用的智能輪詢方法 四、結語 作者&#xff…