AI 第18天:建構影像分類模型
今天的課程將帶你進一步學習如何構建影像分類模型。我們將使用 Keras 和 TensorFlow 架構一個簡單的卷積神經網路(CNN),並使用經典的 CIFAR-10 資料集來進行圖像分類任務。
課程目標
- 理解影像分類任務的流程與挑戰。
- 學習卷積神經網路(CNN)的核心概念與運作原理。
- 使用 TensorFlow 與 Keras 構建一個簡單的影像分類模型。
課程內容
1. 影像分類的挑戰
- 高維數據特性:影像包含大量像素,維度通常較高。
- 特徵提取困難:需要從影像中提取重要的邊緣、形狀等特徵。
- 運算資源需求:影像分類任務需要大量的運算資源。
2. 卷積神經網路(CNN)基礎概念
CNN 是影像分類的核心工具,其結構與傳統神經網路不同,能有效地從影像中提取特徵。
2.1 卷積層(Convolutional Layer)
卷積層使用濾波器(Filter)對影像進行滑動操作,提取局部特徵(如邊緣、紋理等)。
數學公式:
\(z = \sum_{i,j} x[i, j] \cdot w[i, j] + b\)
2.2 池化層(Pooling Layer)
池化層用於降低影像維度,常見方法包括最大池化(Max Pooling)與平均池化(Average Pooling)。
2.3 全連接層(Fully Connected Layer)
全連接層將高維特徵壓縮為低維輸出,用於最終分類。
3. 實作影像分類模型
3.1 載入 CIFAR-10 資料集
CIFAR-10 是一個常用的影像分類資料集,包含 10 個類別,每個影像大小為 32×32 像素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical
# 載入資料集
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
# 正規化影像數據
X_train = X_train / 255.0
X_test = X_test / 255.0
# 將標籤進行 One-Hot 編碼
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
print(f"訓練集形狀: {X_train.shape}")
print(f"測試集形狀: {X_test.shape}")
3.2 建構卷積神經網路模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
# 建立模型
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)), # 卷積層 1
MaxPooling2D((2, 2)), # 池化層 1
Conv2D(64, (3, 3), activation='relu'), # 卷積層 2
MaxPooling2D((2, 2)), # 池化層 2
Flatten(), # 展平層
Dense(128, activation='relu'), # 全連接層
Dropout(0.5), # 隨機丟棄(防止過擬合)
Dense(10, activation='softmax') # 輸出層
])
# 編譯模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# 查看模型架構
model.summary()
3.3 模型訓練與評估
1
2
3
4
5
6
# 訓練模型
history = model.fit(X_train, y_train, epochs=20, batch_size=64, validation_split=0.2, verbose=1)
# 評估模型
loss, accuracy = model.evaluate(X_test, y_test)
print(f"測試集準確率: {accuracy:.2f}")
4. 視覺化訓練過程
使用 Matplotlib 將訓練過程中的損失與準確率繪製出來,幫助我們觀察模型的學習情況。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import matplotlib.pyplot as plt
# 繪製準確率
plt.plot(history.history['accuracy'], label='訓練準確率')
plt.plot(history.history['val_accuracy'], label='驗證準確率')
plt.legend()
plt.title('準確率')
# 繪製損失
plt.figure()
plt.plot(history.history['loss'], label='訓練損失')
plt.plot(history.history['val_loss'], label='驗證損失')
plt.legend()
plt.title('損失')
plt.show()
5. 改進模型性能的技巧
- 增加卷積層或濾波器數量以提取更多特徵。
- 使用資料增強(Data Augmentation)增加訓練樣本的多樣性。
- 調整超參數(如學習率、批次大小)以優化模型性能。
課後作業
- 修改模型的結構(如新增卷積層或全連接層),觀察對準確率的影響。
- 實驗不同的激活函數(如 sigmoid 或 tanh)。
- 使用 Keras 的資料增強功能(
ImageDataGenerator
),提升模型的泛化能力。
本文章以 CC BY 4.0 授權