文章

AI 第18天:建構影像分類模型

今天的課程將帶你進一步學習如何構建影像分類模型。我們將使用 Keras 和 TensorFlow 架構一個簡單的卷積神經網路(CNN),並使用經典的 CIFAR-10 資料集來進行圖像分類任務。


課程目標

  1. 理解影像分類任務的流程與挑戰。
  2. 學習卷積神經網路(CNN)的核心概念與運作原理。
  3. 使用 TensorFlow 與 Keras 構建一個簡單的影像分類模型。

課程內容

1. 影像分類的挑戰

  1. 高維數據特性:影像包含大量像素,維度通常較高。
  2. 特徵提取困難:需要從影像中提取重要的邊緣、形狀等特徵。
  3. 運算資源需求:影像分類任務需要大量的運算資源。

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. 改進模型性能的技巧

  1. 增加卷積層或濾波器數量以提取更多特徵。
  2. 使用資料增強(Data Augmentation)增加訓練樣本的多樣性。
  3. 調整超參數(如學習率、批次大小)以優化模型性能。

課後作業

  1. 修改模型的結構(如新增卷積層或全連接層),觀察對準確率的影響。
  2. 實驗不同的激活函數(如 sigmoid 或 tanh)。
  3. 使用 Keras 的資料增強功能(ImageDataGenerator),提升模型的泛化能力。

本文章以 CC BY 4.0 授權