AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
10/100 第一週:深度學習基礎入門
10.小結與測驗:手寫數字分類(MNIST)🖊 用 TensorFlow 練習第一個深度模型!
________________________________________
✅ 基礎小結:你學會了什麼?
主題 核心觀念
感知機與前向傳播 每一層神經元加權計算輸入資訊並輸出 → 層層傳遞預測值
反向傳播 根據損失函數,透過梯度下降調整權重,逐步學習
激活函數 ReLU 提升效率、Sigmoid 和 Tanh 非線性、Softmax 分類
損失函數與優化器 CrossEntropy 用於分類、Adam 最普遍有效
正則化與過擬合 Dropout、L2 控制模型複雜度,防止模型死記訓練資料
資料切分 訓練/驗證/測試資料必須分離,才能驗證模型是否真正具泛化能力
________________________________________
📝 單選題測驗(共 5 題)
1️⃣ 下列哪一個激活函數最常用於多分類問題的輸出層?
A. ReLU B. Tanh C. Sigmoid D. Softmax
✅ 答案:D
🔍 解析: Softmax 將輸出轉為機率分布,適合多分類輸出(如 0~9 十個數字類別)。
________________________________________
2️⃣ Dropout 的作用是什麼?
A. 增加模型深度 B. 隨機調整學習率 C. 避免過擬合 D. 訓練速度變快
✅ 答案:C
🔍 解析: Dropout 隨機忽略神經元,防止過度依賴部分特徵,有效降低過擬合風險。
________________________________________
3️⃣ 以下哪一項不應該參與模型訓練?
A. 訓練資料 B. 驗證資料 C. 測試資料 D. 所有資料都應該訓練
✅ 答案:C
🔍 解析: 測試資料應完全保留用於「最終驗證」,不能用於訓練或調參。
________________________________________
4️⃣ 神經網路的「反向傳播」主要目的是?
A. 產生輸出 B. 更新權重 C. 儲存結果 D. 做資料預處理
✅ 答案:B
🔍 解析: 反向傳播用來根據誤差調整每層的權重與偏差,幫助模型逐步學習。
________________________________________
5️⃣ 下列哪一個方法是正則化策略?
A. 使用 Adam B. 增加神經元 C. Dropout D. 加快學習率
✅ 答案:C
🔍 解析: Dropout 是常見正則化方法,可強化泛化能力並降低模型複雜度。
________________________________________
✅ TensorFlow 小示範:MNIST 手寫數字分類 🖊
下面範例使用 TensorFlow 建立並訓練一個簡單的深度學習模型來辨識手寫數字(MNIST 資料集)。首先將影像像素正規化至 0~1,再透過 Sequential
建立模型:將 28x28 的圖片攤平成 784 維輸入,經過一層 128 個神經元與 ReLU 激活,再加入 Dropout 防止過擬合,最後輸出 10 類 softmax 預測。使用 Adam 優化器與交叉熵作為損失函數,訓練 5 個 epoch,並保留 20% 作為驗證集。最後在測試資料上評估準確率,並印出第一筆預測結果。
📂 資料準備:
python
import tensorflow as tf
# 載入 MNIST 數據
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# 正規化處理
x_train, x_test = x_train / 255.0, x_test / 255.0
這段程式碼載入 MNIST 手寫數字資料集,並將影像像素值從原本的 0~255 範圍縮放到 0~1 之間,透過除以 255.0 進行正規化處理,有助於加快模型收斂速度並提升訓練穩定性,是訓練神經網路前常見的預處理步驟。
________________________________________
🧠 模型建立:
python
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)), # 784個輸入特徵
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2), # Dropout避免過擬合
tf.keras.layers.Dense(10, activation='softmax') # 10個分類(0~9)
])
這段程式碼建立了一個簡單的深度學習分類模型。首先將 28x28 的影像攤平成 784 維向量,接著通過一層含 128 個 ReLU 激活的全連接層,再透過 Dropout(20% 隨機關閉神經元)減少過擬合,最後輸出層使用 softmax 將結果轉為 10 個類別的機率分佈,對應於手寫數字 0~9 的分類任務。
________________________________________
⚙️ 編譯與訓練:
python
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# 訓練模型
model.fit(x_train, y_train, epochs=5, validation_split=0.2)
這段程式碼先使用 compile 設定模型的訓練方式,選擇 Adam 最佳化器、稀疏分類交叉熵作為損失函數(適用於整數標籤的多分類問題),並追蹤準確率作為評估指標。接著用 fit 函數訓練模型,將訓練資料中 20% 拿來當驗證集,共訓練 5 個世代(epochs),以評估模型在訓練過程中的學習效果與泛化能力。
________________________________________
📊 測試與預測:
python
# 模型效能評估
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f"\n測試準確率:{test_acc:.4f}")
# 範例預測
import numpy as np
predictions = model.predict(x_test)
print(f"第1筆預測結果:{np.argmax(predictions[0])}")
這段程式碼先使用 evaluate 函數在測試資料上評估模型效能,輸出損失值與準確率,讓我們了解模型在未見過資料上的表現。接著使用 predict 對測試資料進行預測,predictions 是每筆資料對 10 個數字類別的機率分布,透過 np.argmax(predictions[0]) 取得第 1 筆資料預測結果中機率最高的類別,代表模型判斷這張圖片最可能是哪個數字。
________________________________________
🎯 小結與啟示:
✅ 這是你第一個完整訓練的神經網路模型
✅ 通過實作了解訓練、驗證與測試的全流程
✅ MLP 雖然簡單,但足以實現 98% MNIST 準確率
✅ 下一步:進入 CNN 卷積神經網路,挑戰更高難度的圖像辨識任務!