版本說明:本文依據 CS231N Spring 2026 課表連結的 Lecture 9 投影片(147 頁,2026-09-30 下載核對),並比對 Spring 2025 投影片。錄影請看 Spring 2025 的 Lecture 9;2026 錄影只放在 Canvas,限修課生,兩年內容可能有差異。存取等級 A3。
系列位置:上一篇 L8:Attention、Transformer 與 ViT|下一篇 L10:影片理解|系列總覽
到目前為止,CS231N 的模型都只回答一個問題:這張圖是什麼?第 9 講把問題拆細:圖裡有哪些東西、各在哪裡、每個像素屬於誰?最後再反過來問:模型做判斷時,到底在看哪裡?
先講一個落差:課表和投影片不一樣
2026 課表替這一講列了六個主題:單階段偵測、兩階段偵測、語意/實例/全景分割、特徵可視化與 inversion、對抗樣本、DeepDream 與風格轉換。
實際的 147 頁投影片只講到前三類加上一部分可視化。投影片裡搜尋不到 adversarial、DeepDream、style transfer、panoptic、inversion 這些詞;2025 年的 178 頁版本也一樣。投影片自己的目錄(第 29 頁)是:Transformer 回顧 → 語意分割、物件偵測、實例分割 → 模型各層可視化、saliency map、CAM 與 Grad-CAM。
所以本文照投影片的範圍寫,不替缺的主題補內容。想看對抗樣本與生成相關的主題,可以讀本站的 CS230 對抗樣本與生成模型。
投影片前 28 頁是第 8 講的 Transformer 與 ViT 回顧,另外多了一頁 RMSNorm:用均方根取代 LayerNorm 的正規化,投影片說訓練會稍微穩定一點。這部分請見上一篇。
四種任務,四種輸出
投影片第 30 頁用一張圖把任務排成一排:
| 任務 | 輸出 | 投影片的描述 |
|---|---|---|
| 分類 | 一個標籤(CAT) | 沒有空間範圍 |
| 語意分割 | 每個像素一個標籤(GRASS、CAT、TREE、SKY) | 沒有物件,只有像素 |
| 物件偵測 | 每個物件一個類別加一個框(DOG、DOG、CAT) | 多個物件 |
| 實例分割 | 每個物件一張遮罩 | 多個物件 |
從左到右,輸出越來越細。這一講的主脊就是:每往右一格,網路結構要多做什麼改變。
語意分割:讓輸出跟輸入一樣大
場景:替每個像素標上類別。兩頭牛站在一起,語意分割只標「牛」,不分是哪一頭。
投影片試了三個想法,每一個都卡在一個問題上:
- 滑動視窗:對每個像素切一小塊,用 CNN 分類中心像素。問題是非常沒效率,重疊的小塊之間沒有共用特徵。
- 整張圖丟進分類 CNN:分類網路為了加深會一路縮小特徵圖,但分割要求輸出跟輸入一樣大。
- 全卷積、不降採樣:只用卷積層,一次預測所有像素(輸出 C×H×W 的分數,argmax 得到 H×W 的預測)。問題是在原始解析度上做卷積太貴。
解法是 FCN(Long、Shelhamer 與 Darrell,CVPR 2015)這類設計:網路內部先降採樣(pooling、strided convolution),再升採樣回原始大小。
升採樣有兩類做法:
- 固定規則的 unpooling:nearest neighbor 把值複製到整個區塊;「bed of nails」只放在左上角、其餘補 0;max unpooling 記住先前 max pooling 選中的位置,把值放回那個位置。
- 可學習的轉置卷積:輸入的每個像素乘上 filter,貼到輸出上,重疊的地方相加。投影片用 3×3、stride 2、pad 1 的例子,把 2×2 輸入升到 4×4,並附了一個一維例子:輸出就是「以輸入值加權的 filter 複本」相加。
U-Net
U-Net(Ronneberger et al. 2015)在這個架構上多做一件事。投影片的說法是:降採樣階段擴大視野,但會失去空間資訊;升採樣階段要重建高解析度的輸出。U-Net 把降採樣階段的高解析特徵圖直接接到升採樣階段對應的層,把丟掉的細節補回來。A3 的 DDPM 題目起始碼也附了一個 unet.py,到A3 導讀會再遇到它。
物件偵測:輸出的數量不固定
單一物件:分類加迴歸
如果圖裡只有一個物件,事情很簡單。CNN 的特徵向量接兩個頭:一個輸出類別分數(softmax loss),一個輸出框的四個數字 (x, y, w, h)(L2 loss)。投影片的關鍵句是「把定位當成迴歸問題」,兩個 loss 相加成 multitask loss。
多個物件:麻煩在這裡
每張圖的物件數量不同:一隻貓要輸出 4 個數字,三隻動物就要 12 個。固定大小的輸出層放不下。
最直接的想法是切很多塊,逐塊分類成某個物件或背景。問題是位置、尺度、長寬比的組合太多,計算量爆炸。
兩階段:R-CNN 家族
R-CNN(Girshick et al., CVPR 2014)先用 region proposal 方法找出「看起來像物件」的區域。投影片舉 Selective Search 為例:在 CPU 上幾秒內產生約 2000 個候選。每個候選區域縮放成 224×224,各自過一次 ImageNet 預訓練的 CNN,用 SVM 分類,再預測四個修正量 (dx, dy, dw, dh) 微調框的位置。
投影片直接點出問題:非常慢,每張圖要做約 2000 次獨立的 forward。
Fast R-CNN(Girshick, ICCV 2015)的想法是:先把整張圖過一次 backbone(AlexNet、VGG、ResNet 等),再從特徵圖上裁切每個候選區域並調整大小,交給一個小的逐區域網路,輸出類別與框的偏移。
Faster R-CNN(Ren et al.)連 region proposal 都交給網路學,也就是 Region Proposal Network(RPN)。投影片的例子是:640×480 的輸入經過 CNN 變成 512×20×15 的特徵圖;在特徵圖每個位置想像一個固定大小的 anchor box,預測它是不是物件(二元分類),對正例再迴歸四個數字,修正到真實框。實務上每個位置放 K 個不同大小與比例的 anchor,把 K×20×15 個框依「objectness」分數排序,取前約 300 個當候選。
單階段:YOLO、SSD、RetinaNet
單階段偵測器把「找候選」和「分類」合成一步。投影片的描述是:把圖切成 7×7 的格子,每格放 B 個基準框,每個框迴歸 5 個數字 (dx, dy, dh, dw, confidence),再預測 C 個類別的分數(背景也算一類),輸出是 7×7×(5B + C)。投影片說它很像 RPN,差別在於它直接預測類別。
YOLO(Redmon et al., CVPR 2016)的標題就是「Unified, Real-Time Object Detection」,投影片也把它標為即時物件偵測。投影片同一頁還列出 SSD 與 RetinaNet(Focal Loss)。
DETR:不用 anchor
DETR(Carion et al., ECCV 2020)把第 8 講的 Transformer 帶進偵測。投影片的三句話:直接從 Transformer 輸出一組框;沒有 anchor,也不迴歸框的變換;用 bipartite matching 把預測框配對到真實框,再訓練模型迴歸框的座標。
實例分割:Mask R-CNN
實例分割要同時分出個體和像素。Mask R-CNN(He et al., ICCV 2017)的做法很省事:在 Faster R-CNN 上,對每個 RoI 多接一個小的遮罩網路,預測一張 28×28 的二元遮罩。投影片的架構圖裡,每個 RoI 經過 RoI Align 得到 256×14×14 的特徵,輸出 C 個類別分數、每個類別 4 個框座標,以及每個類別一張 C×28×28 的遮罩。投影片還提到它也能做姿態估計。
模型在看哪裡?
最後一段從「怎麼做任務」轉到「怎麼理解模型」。
- 可視化第一層 filter:AlexNet 的第一層是 64 個 3×11×11 的 filter;ResNet-18、ResNet-101、DenseNet-121 都是 64 個 3×7×7。把它們畫成小圖,可以看到邊緣與顏色的偵測器。
- Saliency map(Simonyan et al. 2014):算未正規化的類別分數對輸入像素的梯度,取絕對值,再在 RGB 三個通道上取最大值。亮的地方就是改動後最會影響分數的像素。
- CAM(Zhou et al., CVPR 2016):網路最後是「卷積特徵 f → 全域平均池化 → 全連接層」時,類別分數可以改寫成「每個位置的特徵用全連接權重加總,再平均」。把平均之前的那張圖拿出來,就是類別熱度圖。限制是只能用在最後一個卷積層。
- Grad-CAM(Selvaraju et al., CVPR 2017)解決這個限制,步驟見下方。
- ViT 特徵可視化:投影片最後一頁引用兩篇 2022 年論文的圖,把同樣的想法用在 ViT。
Grad-CAM 的四個步驟(投影片第 140–143 頁)
1. 任選一層,特徵 A ∈ R^{H×W×K}
2. 算類別分數 S_c 對 A 的梯度 ∂S_c/∂A ∈ R^{H×W×K}
3. 在空間上平均梯度,得到每個通道的權重
α_k = (1/HW) Σ_{h,w} ∂S_c/∂A_{h,w,k}
4. 熱度圖 M^c_{h,w} = ReLU( Σ_k α_k A_{h,w,k} )
自學怎麼做
- 先看錄影,再翻投影片:2025 年錄影約 1 小時 13 分。投影片比 2025 版少了 31 頁,但目錄相同。
- 畫一張表:把 R-CNN → Fast R-CNN → Faster R-CNN → YOLO → DETR 各自省掉了什麼寫下來。這是本講最容易混淆的地方。
- 親手算一次轉置卷積:用投影片的一維例子,在紙上把兩個輸入值與三格 filter 的輸出算出來。
- 課表建議閱讀:FCN、Fast R-CNN、Faster R-CNN、DETR 論文,以及 DETR 的官方 blog 與影片。
延伸閱讀
- 對抗樣本、生成模型:CS230 對抗樣本與生成模型
- 同一套 Transformer 基礎:L8:Attention、Transformer 與 ViT
- 更完整的深度學習理論課:MIT 6.7960 導讀
參考資料
- CS231N Lecture 9 投影片(Spring 2026) — 本文所有架構、數字與例子的出處
- CS231N Lecture 9 投影片(Spring 2025) — 比對用,同樣沒有對抗樣本與風格轉換
- CS231N 課表(Spring 2026) — 4/28 講次主題與建議閱讀
- Spring 2025 Lecture 9 錄影
- Long, Shelhamer & Darrell, Fully Convolutional Networks for Semantic Segmentation(CVPR 2015)
- Ronneberger et al., U-Net(2015)
- Girshick et al., Rich feature hierarchies for accurate object detection and semantic segmentation(CVPR 2014)
- Girshick, Fast R-CNN(ICCV 2015)
- Ren et al., Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
- Redmon et al., You Only Look Once(CVPR 2016)
- Carion et al., End-to-End Object Detection with Transformers(ECCV 2020)
- He et al., Mask R-CNN(ICCV 2017)
- Simonyan, Vedaldi & Zisserman, Deep Inside Convolutional Networks(ICLR Workshop 2014)
- Zhou et al., Learning Deep Features for Discriminative Localization(CVPR 2016)
- Selvaraju et al., Grad-CAM(CVPR 2017)
Loading...