iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用

VGG16 哪一層的參數量最多?

原題 42

VGG16 是由牛津大學 Visual Geometry Group (VGG) 在 2014 年提出的經典卷積神經網路(Convolutional Neural Network, CNN)架構。該模型以簡潔且規則的層堆疊設計聞名,廣泛應用於影像分類、特徵提取及遷移學習等任務。附圖程式碼載入了預訓練的 VGG16 模型,並輸出其完整層級結構及參數統計摘要(如附表,總參數約 138,357,544)。在深度神經網路中,不同層的參數量(parameter count)差異極大。有些層雖然數量少但計算量大,有些則相反。了解參數分佈情形,有助於模型壓縮與遷移學習設計。請問在 VGG16 中,下列何者的參數量最多?

白話

某動物園影像辨識專案的工程師載入了 VGG16 模型,並用 model.summary() 印出每層的參數量統計表。整個模型總參數約 1.38 億個,但不同類型的層,參數量差異非常大——有些層幾乎沒有參數,有些層卻佔了大半。

問你:在 VGG16 的所有層類型中,哪一種層的參數量最多?

點選你的答案。

01 總結

一句話總結

VGG16 裡參數量最多的是全連接層(Linear):第一個全連接層 Linear-33 單獨就佔了約 1.027 億個參數(102,764,544),遠超過 13 層卷積層加總的 1,480 萬個

02 情境

先感受問題:動物園影像辨識專案的參數帳本

某動物園想用 VGG16 辨識 200 種動物,工程師載入模型後用 torchsummary 印出每層的參數統計表,發現一個讓人驚訝的事:雖然模型前面有 13 層卷積層(Conv2d)負責掃描影像的特徵,但參數量最龐大的不是這些卷積層,而是後面的全連接層(Linear)。

為什麼會這樣?卷積層的設計很「省」:一個 3×3 的卷積核心只有 9 個權重,無論影像多大,這 9 個權重在整張影像上「滑動共用」,參數量相對少。

全連接層則完全不同:每個輸入神經元都要和每個輸出神經元連線,輸入有多少、輸出有多少,權重就有多少個乘積。VGG16 的第一個全連接層輸入維度高達 25,088(512 × 7 × 7),輸出 4,096 個神經元,光這一層就有 25,088 × 4,096 + 4,096 ≈ 1 億個參數。

03 對照

「卷積層在前面、數量多,參數一定最多」為什麼是錯覺?

  1. 層數多不等於參數多:VGG16 有 13 層 Conv2d,但每層的卷積核心很小(3×3),而且在空間上共享權重,所以 13 層加起來的參數也不及一個全連接層。
  2. 卷積層的「共享權重」特性:一個 3×3、輸入 512 通道、輸出 512 通道的卷積層,參數量只有 3×3×512×512 + 512 ≈ 2,359,808 個,而非 512×512×整張特徵圖大小。
  3. ReLU 激活函數沒有參數:ReLU 只是一個 max(0, x) 的函數,不帶任何可學習的權重,參數量是 0。
  4. 池化層也沒有參數:MaxPool2d 只是取窗口內的最大值,沒有可學習的參數。
  5. 全連接層的「密集連接」代價極高:一旦把二維特徵圖「攤平」成一維向量,每個元素都要和下一層的每個神經元相連,參數量是輸入維度 × 輸出維度,數字急劇膨脹。
04 解法

全連接層:攤平後的密集連線代價

動物園工程師看到 model.summary() 的輸出,清楚看到參數分布:

  • 13 層 Conv2d 加總:約 14,714,688 個參數(佔總數約 10.6%)
  • Linear-33(第一個全連接層):102,764,544 個參數(佔總數約 74.3%)
  • Linear-36(第二個全連接層):16,781,312 個參數(佔總數約 12.1%)
  • Linear-39(第三個全連接層,輸出層):4,097,000 個參數(佔總數約 3.0%)
  • ReLU 和池化層:0 個參數

全連接層三層加起來佔了約 89.4% 的參數,其中第一層最多。這也是為什麼現代模型壓縮、遷移學習時,優先凍結卷積層、只訓練全連接層,因為全連接層才是真正的「參數大戶」。

這就是選項 B 講的:全連接層(Linear)的參數量最多

技術版:VGG16 參數量計算與模型壓縮意涵

中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。

Step 1 純故事版(不出現公式)

想像整棟 VGG16 是一家公司的組織圖。前面的卷積層像是各部門的「共用顧問」,每個顧問只負責一種模式(例如「找邊緣」「找顏色」),在整張影像上來回巡視,人少但效率高。

後面的全連接層像是「全員大會議室」:所有顧問的發現都要匯報給所有高層主管,每位顧問都要對每位主管說一遍,人員連線爆炸性成長。第一次全員大會議(第一個全連接層)最誇張:25,000 個顧問,每人各對 4,096 個主管匯報,光這一場會議就需要 1 億條溝通連線。

Step 2 中文 ↔ 程式碼對照
白話說法程式碼 / 數字
載入預訓練 VGG16model = models.vgg16(pretrained=True)
印出每層參數統計from torchsummary import summary
summary(model, (3, 224, 224))
最後卷積後的特徵圖大小512 × 7 × 7 = 25,088(攤平後的向量長度)
第一個全連接層nn.Linear(25088, 4096),參數 = 25088×4096+4096 ≈ 102,764,544
凍結卷積層的語法for p in model.features.parameters(): p.requires_grad = False
Step 3 符號角色表
model.features
VGG16 的卷積部分(13 層 Conv2d + ReLU + MaxPool2d),負責特徵提取
model.classifier
VGG16 的全連接部分(3 層 Linear + ReLU + Dropout),負責分類決策
AdaptiveAvgPool2d
在 features 和 classifier 之間,把特徵圖調整為固定大小 7×7
Linear-33 / Linear-36 / Linear-39
三個全連接層,數字是 torchsummary 輸出的層序號
pretrained=True
載入在 ImageNet 上預訓練的權重,不用從頭訓練
Step 4 完整公式對應
卷積層參數公式:(kernel_h × kernel_w × C_in + 1) × C_out
  最後一組 Conv2d (512→512, 3×3):
  (3×3×512 + 1) × 512 = 2,359,808

全連接層參數公式:(input_size + 1) × output_size
  Linear-33: (25088 + 1) × 4096 = 102,764,544  ← 最多
  Linear-36: (4096  + 1) × 4096 = 16,781,312
  Linear-39: (4096  + 1) × 1000 = 4,097,000

ReLU / MaxPool2d / Dropout: 0 個參數

全模型 13 層 Conv2d 總計:約 14,714,688 個
全模型 3 層 Linear 總計:約 123,642,856 個
  → 全連接層佔 123M / 138M ≈ 89.4% 的參數量
Step 5 自我複述
  1. 卷積層為什麼比全連接層「省參數」?權重共享的機制是什麼?
  2. VGG16 總共有多少層 Conv2d?多少層 Linear?
  3. AdaptiveAvgPool2d 的作用是什麼?為什麼需要它?
  4. 如果把全連接層的輸出從 1000 改為 200(200 類動物),參數量會如何改變?
  5. 模型壓縮通常優先針對哪種層?為什麼?
05 陷阱

為什麼其他選項是錯的

選項 A 卷積層(Conv2d)

字面在說什麼:VGG16 的 13 層卷積層是參數量最多的層。

為什麼不對:卷積層雖然數量多(13 層),但每個卷積核只有 3×3=9 個權重,而且在整張特徵圖上共享,所以單層參數量遠小於全連接層。13 層卷積加起來約 1,471 萬個,而第一個全連接層單獨就有 1.027 億個,相差超過 6 倍。

誰會選錯:直覺上覺得「卷積層是 CNN 的核心,參數最多」,沒想到全連接層因為全員連線而遠超卷積層。

選項 C ReLU 激活函數

字面在說什麼:ReLU 層的參數量最多。

為什麼不對:ReLU(Rectified Linear Unit)是一個純數學運算 f(x) = max(0, x),沒有任何可學習的參數,參數量為 0。它只是對每個元素做一次非線性變換,不儲存任何權重。

誰會選錯:以為激活函數也有參數,或把「計算量多」誤解成「參數多」的人。ReLU 雖然在每次前向傳播中都要執行,但它不帶任何需要訓練的權重。

選項 D 池化層(MaxPool2d, AdaptiveAvgPool2d)

字面在說什麼:池化層是參數量最多的層。

為什麼不對:MaxPool2d 只是在一個窗口(如 2×2)內取最大值,不涉及任何可學習的參數,參數量同樣是 0。AdaptiveAvgPool2d 也一樣,只是取平均值,沒有權重。池化層的作用是降低空間維度,而不是學習特徵。

誰會選錯:覺得池化層「負責縮小特徵圖、一定很重要」,就以為它有很多參數。重要性和參數量是兩回事。

06 變形

同個考點下次怎麼變形

變形 1 換模型

直覺:ResNet-50 也是 CNN,全連接層的參數比例跟 VGG16 一樣嗎?

答案:ResNet-50 在全連接層(FC 1000)之前用 GlobalAveragePooling 把特徵壓縮到 2048 維,全連接層只有 2048×1000+1000 ≈ 204 萬個參數,佔總參數(2,500 萬)的 8%。VGG16 因為攤平後維度高達 25,088,全連接層比例遠高於 ResNet。這就是為什麼 ResNet 更受歡迎:同樣深度,參數少很多。

變形 2 計算題

直覺:一個 Linear(512, 256) 層有多少個參數?

答案:(512 + 1) × 256 = 131,328 個。其中 512×256 = 131,072 個是權重(weight),256 個是偏差(bias)。如果設 bias=False,則只有 131,072 個。

變形 3 遷移學習策略

直覺:知道全連接層參數最多後,遷移學習應該凍結哪些層?

答案:通常凍結 model.features(卷積部分),只訓練 model.classifier(全連接部分),因為:1. 卷積層學到的低階特徵(邊緣、紋理)具有通用性;2. 全連接層的分類決策和任務高度相關,需要針對新任務重新調整;3. 只訓練參數最多的全連接層,反而計算成本也較高,但精度提升明顯。

變形 4 模型壓縮

直覺:如果要把 VGG16 縮小到原來的一半參數量,最有效的方式是什麼?

答案:針對全連接層下手,因為它佔了 89.4% 的參數。策略有:1. 減少全連接層的神經元數(4096→2048);2. 用 GlobalAveragePooling 取代第一個全連接層(ResNet 的做法);3. 知識蒸餾(Knowledge Distillation),用小模型學大模型的輸出。

變形 5 程式碼題

直覺:如何用 Python 印出每一層的名稱和參數量?

答案:使用 `for name, param in model.named_parameters(): print(name, param.numel())`,其中 numel() 回傳張量的元素總數,也就是該層的參數量。或用 `sum(p.numel() for p in model.parameters())` 算出總參數量。

07 延伸

想再往下看,這 5 個

出處

iPAS 經濟部產業人才能力鑑定 ・ 114 年第二梯次 iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用 第 42 題

查看官方原文 PDF