https://learn.nvidia.com/courses/course?course_id=course-v1:DLI+S-FX-01+V1&unit=block-v1:DLI+S-FX-01+V1+type@vertical+block@e2b8cfd88f2a45c89ef908f7929c266c
# 1: An Introduction to Deep Learning
課程目標是讓學員初步掌握人工智慧與機器學習全貌,並決定往後專攻方向。若參與程式練習,教材可保留一年,隨時回來練習。這種在「放鬆警覺」狀態下學習的方式,呼應大腦在「執行」與「學習」之間的切換,也類似神經網路在「推論」與「訓練」兩種模式間的轉換。
接下來回顧人工智慧發展。人類自電腦誕生起便嘗試讓機器執行人類任務,曾預期幾十年內可達到人類等級智慧,但受限於硬體與架構,通用智慧遲遲無法實現。二戰時期,學界曾探討類神經網路,但最終選擇更可靠、效率更高的馮紐曼架構,成為現代 CPU 基礎。
1990 年代初,電腦「Deep Blue」透過大規模暴力計算與硬式規則,擊敗西洋棋世界冠軍,引發世人關注。之後研究走向含機率元素的雙陸棋,神經網路展現出色表現但仍未稱霸,當時仍多數專案採「專家系統」模式:由大量工程師將專家規則硬式編碼。然而這些系統侷限於人類可明確定義的規則,對某些人類直覺簡單卻難以條文化的任務成效不佳。
要讓機器「看圖說詞」—例如辨識「海浪」、「計程車」、「小貓」—對成人毫不費力,卻難以以規則方式教給電腦。人類通常透過大量示例與試錯學習;深度學習同樣仰賴大量資料與反覆調整。網際網路帶來的龐大資料量,加上 GPU 平行運算能力,使得訓練大型神經網路成為可能。神經網路本質是矩陣乘法,與電腦圖學使用的數學基礎相同,因此 GPU 的數百至數千核心,能大幅縮短訓練時間。
深度學習顛覆傳統軟體開發流程。傳統作法是先由人撰寫規則,再依規則處理輸入並產生輸出;深度學習則先準備輸入與對應輸出(資料集),模型在反覆猜測與修正中自行學出規則。若規則單純明確,直接寫程式仍較有效;但當規則複雜、難以條文化時,深度學習便是理想選項。為處理自然語言等高難度任務,現今網路深度與參數量可達數十億,「深度」意指隱藏層數眾多。
過去十餘年,深度學習對多個領域產生重大影響:
電腦視覺因高品質標註影像大量湧現而快速進步。
自然語言處理推動即時翻譯、語音辨識與虛擬助理普及。
推薦系統為社群媒體、串流影音與電商提供個人化內容。
強化學習讓 AlphaGo 擊敗世界棋王,並在 StarCraft、Dota 等電競挑戰頂尖玩家。
在深入理論之前,我們將直接操作神經網路範例,觀察模型架構並嘗試修改程式。如需重置,只要重啟 GPU 即可。準備好了就開始動手實作,親自體驗深度學習的魅力。
# 深度學習影像分類完整教材
---
## 0. 前言
* **情境**:我們剛完成一次 MNIST 手寫數字實驗,模型訓練/驗證表現已逼近 99%。
* **目的**:回顧整個流程、拆解背後概念,為下一份「美國手語字母資料集」打下基礎。
---
## 1. 資料處理流程
### 1.1 影像載入與視覺化
> **原文**:We loaded and visualized our data…
* 將 28×28 像素灰階影像(共 70 000 張)讀入記憶體,並隨機取樣顯示,確認筆跡多樣性。
* **建議示範程式**:`matplotlib` 畫九宮格;說明像素值範圍 0–255。
### 1.2 正規化與形狀調整
> **原文**:We edited our data to get into the right shape as well as normalize the values between zero and one.
* **正規化**:`x = x / 255.0` → 將像素壓至 0–1,利於梯度穩定。
* **展平**:`28×28 = 784`,輸入張量改為 `(batch, 784)`。
* **標籤 one-hot**:`5 → [0 0 0 0 0 1 0 0 0 0]`,有助多類別交叉熵計算。
---
## 2. 模型架構與參數規模
### 2.1 全連接網路 (784 → 512 → 512 → 10)
> **原文**:Remember that there are 784 inputs, 2 layers of 512 neurons and an output layer of 10 neurons…
* **連結數**
* 784 × 512 = **401 408**
* 512 × 512 = **262 144**
* 512 × 10 = **5 120**
* **總計 668 672 個權重**(不含偏差值)。
* **隱藏層啟用函式**:ReLU,提供高效非線性。
* **輸出層啟用**:Softmax(先前示範 sigmoid;Softmax 使 10 類機率總和 = 1)。
---
## 3. 從單一神經元到深度網路
### 3.1 線性回歸(Y = MX + B)回顧
* 早期神經元原型即為回歸線。
* **損失**:均方誤差 (MSE)。
* **最小化方法**:梯度下降 (Gradient Descent)。
### 3.2 梯度下降示例
> **原文**:The computer can’t visualize the loss curve… so we help it by computing the gradient.
* **步驟**
1. 隨機初始化 M、B。
2. 計算梯度 (∂MSE/∂M, ∂MSE/∂B)。
3. 更新參數:`θ ← θ − α · ∇`,其中 α 為學習率 (learning rate)。
* **學習率選擇**:過大→震盪,過小→收斂慢。
* **自動調整**:Adam(Adaptive Moment Estimation)等演算法。
### 3.3 多輸入、多層、無迴圈 = 深度網路
* 輸出可同時送往多個下一層神經元。
* 誤差透過「反向傳播 (Back-Propagation)」由後層傳回前層,自動求梯度。
* **注意**:務必加入非線性啟用函式 (ReLU / Sigmoid),否則多層線性組合仍為線性。
---
## 4. 啟用函式比較
| 函式 | 數學定義 | 幾何形狀 | 特點 |
| ----------- | ------------------ | ---- | ------------------ |
| **Linear** | y = x | 平面 | 無非線性,僅能擬合線性邊界。 |
| **ReLU** | max(0, x) | 楔形 | 收斂快、不飽和;輸出可稀疏化。 |
| **Sigmoid** | 1/(1+e^{-x}) | S 型 | 壓縮至 0–1,可視為機率;易飽和。 |
| **Softmax** | e^{x\_i}/Σe^{x\_j} | — | 多類別輸出機率,Σ=1。 |
---
## 5. 模型複雜度與過擬合
* **大模型缺點**
* 計算量、記憶體成本高。
* 訓練時間長。
* 易發生 **過擬合 (Overfitting)**:訓練集表現佳,驗證/新資料表現差。
* **對策**
* 使用 **訓練 / 驗證** 資料切分監控。
* 正則化 (Dropout, L2)。
* 早停 (Early Stopping)。
* 資料增強 (Data Augmentation)。
---
## 6. 分類任務的損失函式
### 6.1 為何不用 MSE?
* 類別標籤離散,MSE 對機率輸出無法提供良好梯度。
### 6.2 類別交叉熵 (Categorical Cross-Entropy)
> **二元範例**:
$$
\text{BCE}(y,\hat{y}) = -\bigl[ y\ln\hat{y} + (1-y)\ln(1-\hat{y}) \bigr]
$$
* 若真值 y = 1、模型給 $\hat{y}=0$,損失趨近 ∞ → 強力懲罰。
* 多類別情形使用 Softmax + 交叉熵:PyTorch `nn.CrossEntropyLoss()` 已內建。
---
## 7. 實驗延伸:美國手語 (ASL) 字母資料集
* **輸入形狀**:同為 28×28。
* **類別**:A–Z(去除需動作的 J、Z)。
* **任務**:重複 MNIST 流程,體驗資料集轉換、模型泛化能力。
---
## 8. 小結與作業
1. **重述流程**:資料載入 → 正規化 → 建構模型 → 選擇損失與最佳化器 → 訓練 / 驗證 → 評估。
2. **思考題**
* 若驗證準確率持續低於訓練準確率超過 3%,可採哪些改善措施?
* 若改用卷積神經網路 (CNN),對影像分類有何潛在優勢?
3. **實作**
* 以 Softmax 取代 Sigmoid 作為 MNIST 最後一層啟用函式,觀察訓練曲線差異。
* 對 ASL 資料集嘗試加入 `RandomRotation`、`RandomAffine` 影像增強,檢視驗證準確率。
---
### 參考連結
* PyTorch 官方文件:[https://pytorch.org/docs/](https://pytorch.org/docs/)
* Goodfellow, Bengio & Courville, **Deep Learning**(2016)第 6–8 章
* Andrew Ng, **Deep Learning Specialization**(Coursera)
---
# 卷積神經網路(CNN)基礎教材
(翻譯與整理自原始英語逐字稿)
---
## 1. 前言:為何需要卷積神經網路?
* 在上一個實驗中,我們使用**全連接神經網路**(Dense NN)處理影像,僅達到約 **90%** 的準確率。雖然機器表現尚可,但仍不及人類。
* 觀察訓練與驗證曲線可發現:**訓練準確率高、驗證準確率低**,顯示模型已**過擬合**。
* **卷積神經網路(CNN)** 模擬人類視覺皮質的層級處理方式,能更有效擷取影像特徵,是解決過擬合與提升影像辨識的主流方法。
---
## 2. 電腦視覺的傳統卷積觀點
### 2.1 卷積核(Kernel)
* 在影像編輯軟體(如 Photoshop、GIMP)中,「模糊」「銳化」等工具背後皆使用**卷積核**處理影像。
* 卷積核本質為**小型矩陣**,逐點與影像像素相乘後加總,產生新像素值。
### 2.2 基本操作示例
| 操作 | 卷積核效果 |
| ---------------- | -------------------- |
| **模糊(Blur)** | 對窗口像素做加權平均,使影像柔化 |
| **銳化(Sharpen)** | 強化中心像素,同時減去鄰近像素,突出邊緣 |
| **增亮(Brighten)** | 放大中心像素之 RGB 值 |
### 2.3 卷積參數
* **步幅(Stride)**:窗口每次平移的像素數。Stride ↑ → 輸出尺寸 ↓。Stride 過大可能遺漏關鍵細節。
* **填充(Padding)**:為避免邊緣像素缺乏計算,可採 **零填充(Zero Padding)** 在影像四周補零,並保持輸出尺寸不變。
---
## 3. 從卷積核到神經元:CNN 的核心概念
* 卷積核⟶**權重矩陣**;乘加運算⟶**神經元加權求和**。將**可訓練權重**賦予卷積核,即形成卷積層。
* CNN 典型流程:
1. **卷積層**:多組 3×3 核心自動學習邊緣、紋理等局部特徵。
2. **疊圖(Channel Stacking)**:每組卷積輸出一張特徵圖,沿通道方向堆疊形成 3D 張量。
3. **多層卷積**:後續卷積以前層特徵圖為輸入,逐層擷取更抽象資訊(如物件組合)。
4. **展平(Flatten)+全連接層**:將高維特徵展平成向量,交由密集層完成分類。
---
## 4. 關鍵技術元件
### 4.1 邊緣偵測核(Sobel / Prewitt)
* 垂直邊緣核:偵測水平顏色變化。
* 水平邊緣核:偵測垂直顏色變化。
* 合併後可得到每個像素的**梯度方向**,進一步辨識更複雜形狀(如圓形)。
### 4.2 池化(Pooling)
* **最大池化(Max Pooling)**:在窗口內取最大值,達到降維與平移不變性。
* 優點:
* 減少參數與計算量。
* 降低過擬合。
### 4.3 隨機失活(Dropout)
* 訓練時以機率 *p* 隨機關閉神經元,避免模型對單一特徵過度依賴。
* 注意:*p* 不可設為 1;常用 0.3–0.5。
### 4.4 批次正規化(Batch Normalization)
* 於每層輸入進行均值 0、方差 1 的正規化,並學習可訓練縮放與位移參數。
* 雖未真正消除 **內部協變偏移**,但實證可加速收斂並提升穩定性。
---
## 5. 實驗網路結構(示意)
```
Input (28×28×1)
│
├─ Conv 3×3×1, 32 filters → ReLU
├─ Conv 3×3×32, 32 filters → ReLU
├─ MaxPool 2×2, stride 2
│
├─ Conv 3×3×32, 64 filters → ReLU
├─ Conv 3×3×64, 64 filters → ReLU
├─ MaxPool 2×2, stride 2
│
├─ Flatten
├─ Dense 128 → ReLU
├─ Dropout p=0.5
└─ Dense 10 → Softmax
```
* 此結構適用於 **ASL 手語 28×28 灰階影像**。
* 可依資料集擴大卷積層數或調整 filter 數量。
---
## 6. 總結
* **卷積核 = 可訓練權重的小矩陣**,透過局部感受野捕捉影像局部特徵。
* **CNN** 以層疊卷積與池化逐層抽取高階語義,與人類視覺皮質處理方式相似。
* **Dropout** 與 **Batch Normalization** 是常用正則化工具,可緩解過擬合並穩定訓練。
* 本教材奠定了從傳統卷積概念到現代 CNN 架構的橋樑,為後續實作與優化打下基礎。
---
# 資料品質與資料增強(Data Augmentation)
---
## 1. 為何資料比模型更關鍵?
* **垃圾進、垃圾出(Garbage in, garbage out)**:若示例品質低,再強大的模型仍難以學習有效規則。
* **數據多樣性**:
* 同一概念可有大量變異(狗的品種、體型、毛色等)。
* 需同時蒐集足夠「非該類」樣本(如狼、狐狸、郊狼)供模型判斷邊界。
> **結論**:資料集必須兼具**品質**與**多樣性**,否則模型泛化能力受限。
---
## 2. 資料增強核心概念
| 類別 | 操作 | 說明 | 適用情境 | 風險 |
| --------- | -------------------------------------------------------------------------------- | -------------- | ---------------------- | -------------------------------------- |
| **幾何轉換** | 翻轉(Flip)<br>旋轉(Rotate)<br>縮放(Zoom)<br>平移(Shift/Translate)<br>投影/同質變換(Homography) | 透過矩陣運算改變影像空間位置 | 物件方向、位置不重要時(如 ASL 左右手) | 過度翻轉或旋轉 90° 可能產生非自然影像;MNIST「6 ↔ 9」造成混淆 |
| **像素級調整** | 亮度(Brightness)<br>對比(Contrast)<br>色彩漂移(Channel Shift) | 修改每個通道之像素值 | 實務拍攝光源多變、RGB 影像 | 若目標任務高度依賴色彩(如花朵辨識),過度調色會損害辨識 |
> **原則**:增強幅度須讓「人眼仍可辨識」。若人無法判讀,模型多半也困難。
---
## 3. 常見增強方法詳解
### 3.1 翻轉(Flipping)
* **水平翻轉**:適用左右對稱情境;ASL 手語可對應慣用手差異。
* **垂直翻轉**:大多情況不合適(手勢上下顛倒、數字 6→9 易造成誤判)。
### 3.2 旋轉(Rotation)
* 小角度(±15°)可容許拍攝角度誤差。
* 大角度(90° 以上)僅適用於物體方向不固定之任務。
### 3.3 縮放與平移(Zoom & Shift)
* **Zoom-in**:模擬鏡頭靠近;Zoom-out 需額外填充(Padding)。
* **Shift**:配合 Zoom 產生上下左右位移,增強位置不變性。
### 3.4 同質變換(Homography)
* 以 3×3 投影矩陣模擬視角改變,適用道路標誌、文件掃描等透視場景。
### 3.5 亮度/對比度調整
* 隨機增減亮度或對比,強化模型對光照差異的魯棒性。
### 3.6 通道漂移(Channel Shift)
* 對 RGB 各通道加減隨機偏移,適合彩色影像;勿用於灰階資料。
---
## 4. 增強策略與實務建議
1. **隨機抽樣驗證**:定期人工檢視隨機增強樣本,確保仍具可辨識度。
2. **任務導向調整**:
* 色彩關鍵 → 避免過度改變色調。
* 方位關鍵 → 避免大幅翻轉或旋轉。
3. **增強比例**:常見做法為原圖 : 增強圖 ≈ 1 : 3~5,依資料量調整。
4. **框架工具**:PyTorch `torchvision.transforms`、TensorFlow `tf.image` 皆內建上述操作。
---
## 5. 模型部署前之前處理(Preprocessing)
| 問題 | 解法 |
| ---------- | ----------------------------------- |
| **輸入尺寸不符** | 重新調整大小(Resize)至模型訓練解析度。 |
| **通道數不同** | RGB→灰階可取三通道均值;灰階→RGB 可複製單通道。 |
| **單張影像推論** | 於最前維度新增 batch 軸:`img.unsqueeze(0)`。 |
---
## 6. 小結
* 良好的資料品質與多樣化範例是模型效能的根本。
* 資料增強能在**不額外收集實體影像**的情況下顯著擴充資料量並提升泛化,但必須與任務特性相符。
* 部署時需確保輸入資料格式、尺寸、通道與訓練階段一致,並使用相同前處理流程。
# 轉移學習與預訓練模型(Teaching Notes)
(原文翻譯與教材化整理,繁體中文、台灣用語)
---
## 1. 神經網路基本元件快速回顧
| 元件 | 說明 |
| ----------------------- | ------------------------ |
| **學習率 (Learning Rate)** | 梯度下降時,每次調整權重的步幅大小。 |
| **層數 (Depth)** | 模型網路的層級,越深可學習越複雜特徵。 |
| **神經元數量** | 每層單元數,影響表示能力與參數量。 |
| **活化函式** | ReLU、Sigmoid 等決定非線性映射方式。 |
| **訓練資料** | 沒有足夠多樣化的範例,再好的模型也學不會。 |
> **俗語**:Garbage in, garbage out ‑ 資料品質決定模型品質。
---
## 2. 預訓練模型生態系
* **NVIDIA NGC**、**TensorFlow Hub**、**PyTorch Hub**:皆可直接下載、`torch.hub.load()` 或 `tf.keras.applications` 一行導入。
* **Keras** 內建多款模型(VGG、Inception、ResNet),且**免費**。
### 範例:`torch.hub`
```python
import torch
model = torch.hub.load('pytorch/vision', 'vgg16', pretrained=True)
```
---
## 3. VGG16:經典影像分類架構
* 出自論文《Very Deep Convolutional Neural Networks for Large‑Scale Image Recognition》(2014 ImageNet 競賽冠軍)。
* ImageNet:1,000 類別、1,400 萬張標註影像;現代模型 Top‑5 準確率 > 95%。
* **應用案例**:自動寵物門,只允許狗進出。
---
## 4. 轉移學習 (Transfer Learning) 流程
### 4.1 問題設定
> 白宮僅允許第一家庭寵物 **Bo (葡萄牙水犬)** 通過。
| 步驟 | 操作 | 目的 |
| ------------------ | ---------------------------------- | --------------- |
| **1. 載入預訓練模型** | 例:VGG16 (含 ImageNet 權重) | 已具備「辨識狗」能力。 |
| **2. 切除頂層 (Head)** | 移除原 1,000 類 Softmax 輸出 | 重新定義下游任務。 |
| **3. 新增自訂層** | Dense/Dropout → 2 類(Bo vs 非 Bo) | 專注區分目標個體。 |
| **4. 凍結或微調** | 再訓練新層;視資料量決定舊層是否 `trainable=False` | 防止過擬合、小資料集建議凍結。 |
> **層愈靠前 → 特徵愈通用;層愈靠後 → 特徵愈專門。**
> 因此常保留前段卷積權重,僅微調尾端。
### 4.2 凍結策略
* **凍結 (Freeze)**:停止梯度更新,避免小資料導致過擬合。
* **全參數微調**:若新資料量大,可讓舊層權重一起學習以獲得更高專化。
---
## 5. 資料偏差 (Data Bias) 與倫理
* 偏差:資料子集過度代表,模型對其他子群體效果差。
* 例:車款辨識訓練集多為卡車 → 難以辨識跑車、轎車。
* **轉移學習風險**:新模型可能繼承原模型之偏差。需檢查並補充多樣化樣本。
---
## 6. Dreaming/DeepDream 趣味應用
* **概念**:將影像餵入模型,反向最大化特定層輸出,而非最小化損失。
* 效果:誇大模型在影像中偵測到的圖樣,產生夢幻風格圖。
* 步驟:
1. 選擇預訓練網路與目標層。
2. 以影像為參數,梯度上升若干步驟。
3. 輸出新影像。
* 可參考 **Inception v3 DeepDream** 教學連結。
---
## 7. 小結
1. 預訓練模型可省去大規模資料與長時間訓練成本。
2. 轉移學習核心:**保留通用特徵、替換專層、凍結權重**。
3. 注意資料偏差,評估舊模型是否帶入不良偏好。
4. 除正式應用外,Dreaming 亦展現模型內部表徵之可視化魅力。
> **練習建議**:嘗試使用 `torchvision.models.resnet18` 進行相同流程,並比較凍結與全微調對小數據集 (e.g., 100 張 Bo 圖) 的影響。