---
# System prepended metadata

title: Getting Started with Deep Learning

---

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 圖) 的影響。
