VGG16 哪一層的參數量最多?
VGG16 是由牛津大學 Visual Geometry Group (VGG) 在 2014 年提出的經典卷積神經網路(Convolutional Neural Network, CNN)架構。該模型以簡潔且規則的層堆疊設計聞名,廣泛應用於影像分類、特徵提取及遷移學習等任務。附圖程式碼載入了預訓練的 VGG16 模型,並輸出其完整層級結構及參數統計摘要(如附表,總參數約 138,357,544)。在深度神經網路中,不同層的參數量(parameter count)差異極大。有些層雖然數量少但計算量大,有些則相反。了解參數分佈情形,有助於模型壓縮與遷移學習設計。請問在 VGG16 中,下列何者的參數量最多?
某動物園影像辨識專案的工程師載入了 VGG16 模型,並用 model.summary() 印出每層的參數量統計表。整個模型總參數約 1.38 億個,但不同類型的層,參數量差異非常大——有些層幾乎沒有參數,有些層卻佔了大半。
問你:在 VGG16 的所有層類型中,哪一種層的參數量最多?
一句話總結
VGG16 裡參數量最多的是全連接層(Linear):第一個全連接層 Linear-33 單獨就佔了約 1.027 億個參數(102,764,544),遠超過 13 層卷積層加總的 1,480 萬個。
先感受問題:動物園影像辨識專案的參數帳本
某動物園想用 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 億個參數。
「卷積層在前面、數量多,參數一定最多」為什麼是錯覺?
- 層數多不等於參數多:VGG16 有 13 層 Conv2d,但每層的卷積核心很小(3×3),而且在空間上共享權重,所以 13 層加起來的參數也不及一個全連接層。
- 卷積層的「共享權重」特性:一個 3×3、輸入 512 通道、輸出 512 通道的卷積層,參數量只有 3×3×512×512 + 512 ≈ 2,359,808 個,而非 512×512×整張特徵圖大小。
- ReLU 激活函數沒有參數:ReLU 只是一個 max(0, x) 的函數,不帶任何可學習的權重,參數量是 0。
- 池化層也沒有參數:MaxPool2d 只是取窗口內的最大值,沒有可學習的參數。
- 全連接層的「密集連接」代價極高:一旦把二維特徵圖「攤平」成一維向量,每個元素都要和下一層的每個神經元相連,參數量是輸入維度 × 輸出維度,數字急劇膨脹。
全連接層:攤平後的密集連線代價
動物園工程師看到 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 參數量計算與模型壓縮意涵
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像整棟 VGG16 是一家公司的組織圖。前面的卷積層像是各部門的「共用顧問」,每個顧問只負責一種模式(例如「找邊緣」「找顏色」),在整張影像上來回巡視,人少但效率高。
後面的全連接層像是「全員大會議室」:所有顧問的發現都要匯報給所有高層主管,每位顧問都要對每位主管說一遍,人員連線爆炸性成長。第一次全員大會議(第一個全連接層)最誇張:25,000 個顧問,每人各對 4,096 個主管匯報,光這一場會議就需要 1 億條溝通連線。
| 白話說法 | 程式碼 / 數字 |
|---|---|
| 載入預訓練 VGG16 | model = 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 |
- 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 上預訓練的權重,不用從頭訓練
卷積層參數公式:(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% 的參數量
- 卷積層為什麼比全連接層「省參數」?權重共享的機制是什麼?
- VGG16 總共有多少層 Conv2d?多少層 Linear?
- AdaptiveAvgPool2d 的作用是什麼?為什麼需要它?
- 如果把全連接層的輸出從 1000 改為 200(200 類動物),參數量會如何改變?
- 模型壓縮通常優先針對哪種層?為什麼?
為什麼其他選項是錯的
字面在說什麼:VGG16 的 13 層卷積層是參數量最多的層。
為什麼不對:卷積層雖然數量多(13 層),但每個卷積核只有 3×3=9 個權重,而且在整張特徵圖上共享,所以單層參數量遠小於全連接層。13 層卷積加起來約 1,471 萬個,而第一個全連接層單獨就有 1.027 億個,相差超過 6 倍。
誰會選錯:直覺上覺得「卷積層是 CNN 的核心,參數最多」,沒想到全連接層因為全員連線而遠超卷積層。
字面在說什麼:ReLU 層的參數量最多。
為什麼不對:ReLU(Rectified Linear Unit)是一個純數學運算 f(x) = max(0, x),沒有任何可學習的參數,參數量為 0。它只是對每個元素做一次非線性變換,不儲存任何權重。
誰會選錯:以為激活函數也有參數,或把「計算量多」誤解成「參數多」的人。ReLU 雖然在每次前向傳播中都要執行,但它不帶任何需要訓練的權重。
字面在說什麼:池化層是參數量最多的層。
為什麼不對:MaxPool2d 只是在一個窗口(如 2×2)內取最大值,不涉及任何可學習的參數,參數量同樣是 0。AdaptiveAvgPool2d 也一樣,只是取平均值,沒有權重。池化層的作用是降低空間維度,而不是學習特徵。
誰會選錯:覺得池化層「負責縮小特徵圖、一定很重要」,就以為它有很多參數。重要性和參數量是兩回事。
同個考點下次怎麼變形
直覺:ResNet-50 也是 CNN,全連接層的參數比例跟 VGG16 一樣嗎?
答案:ResNet-50 在全連接層(FC 1000)之前用 GlobalAveragePooling 把特徵壓縮到 2048 維,全連接層只有 2048×1000+1000 ≈ 204 萬個參數,佔總參數(2,500 萬)的 8%。VGG16 因為攤平後維度高達 25,088,全連接層比例遠高於 ResNet。這就是為什麼 ResNet 更受歡迎:同樣深度,參數少很多。
直覺:一個 Linear(512, 256) 層有多少個參數?
答案:(512 + 1) × 256 = 131,328 個。其中 512×256 = 131,072 個是權重(weight),256 個是偏差(bias)。如果設 bias=False,則只有 131,072 個。
直覺:知道全連接層參數最多後,遷移學習應該凍結哪些層?
答案:通常凍結 model.features(卷積部分),只訓練 model.classifier(全連接部分),因為:1. 卷積層學到的低階特徵(邊緣、紋理)具有通用性;2. 全連接層的分類決策和任務高度相關,需要針對新任務重新調整;3. 只訓練參數最多的全連接層,反而計算成本也較高,但精度提升明顯。
直覺:如果要把 VGG16 縮小到原來的一半參數量,最有效的方式是什麼?
答案:針對全連接層下手,因為它佔了 89.4% 的參數。策略有:1. 減少全連接層的神經元數(4096→2048);2. 用 GlobalAveragePooling 取代第一個全連接層(ResNet 的做法);3. 知識蒸餾(Knowledge Distillation),用小模型學大模型的輸出。
直覺:如何用 Python 印出每一層的名稱和參數量?
答案:使用 `for name, param in model.named_parameters(): print(name, param.numel())`,其中 numel() 回傳張量的元素總數,也就是該層的參數量。或用 `sum(p.numel() for p in model.parameters())` 算出總參數量。
想再往下看,這 5 個
- 卷積神經網路(CNN)VGG16 的架構基礎,透過卷積核滑動掃描影像、共享權重,是影像識別的主流方法。
- 遷移學習(Transfer Learning)利用 VGG16 預訓練權重的核心技術,凍結卷積層、只重訓練全連接層,讓小資料集也能有好效果。
- 模型參數(Parameters)神經網路中需要從資料學習的可調整數值,本題考的就是各層的參數量分布差異。
- 模型壓縮(Model Compression)減少參數量和計算量的技術,知道哪層參數最多是設計壓縮策略的第一步。
- 特徵提取(Feature Extraction)卷積層的主要工作,從原始像素中抽取邊緣、紋理等高階特徵,與全連接層的分類決策形成分工。