項目目標
通過構建卷積神經網絡(CNN),讓模型學會識別圖片中是什么物體。我們將使用 CIFAR-10 數據集,它包含 10 類:飛機、汽車、鳥、貓、鹿、狗、青蛙、馬、船和卡車。
🛠? 開發環境與依賴
安裝依賴(用命令行運行):
pip install tensorflow matplotlib numpy
推薦使用 Jupyter Notebook,方便邊學邊運行,也可以用 VS Code、PyCharm 等編輯器。
第一步:導入庫
#python
import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt
import numpy as np
這些庫的作用:
tensorflow:用于構建和訓練神經網絡。
matplotlib:用于可視化圖片和訓練過程。
numpy:用于處理數組和數據操作。
第二步:加載和預處理數據
#python
#加載 CIFAR-10 數據集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()#歸一化處理:將像素值從 0~255 映射到 0~1,提高模型訓練效果
x_train = x_train / 255.0
x_test = x_test / 255.0# CIFAR-10 類別名
class_names = ['飛機', '汽車', '鳥', '貓', '鹿', '狗', '青蛙', '馬', '船', '卡車']
第三步:查看數據
#pythonplt.figure(figsize=(10, 2))
for i in range(10):plt.subplot(1, 10, i + 1)plt.xticks([]); plt.yticks([])plt.imshow(x_train[i])plt.xlabel(class_names[y_train[i][0]])
plt.show()
這一部分可以幫你初步理解數據的樣子和類別。
第四步:構建 CNN 模型
#pythonmodel = models.Sequential([layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.MaxPooling2D((2, 2)),layers.Conv2D(64, (3, 3), activation='relu'),layers.Flatten(),layers.Dense(64, activation='relu'),layers.Dense(10) # 輸出層:10個類
])model.summary() # 查看模型結構
📌 注解:
Conv2D 是卷積層,能提取圖像的邊緣、角點等特征。
MaxPooling2D 是池化層,用于降維。
Flatten 把多維數據展平成一維。
Dense 是全連接層,用于分類決策。
第五步:編譯和訓練模型
#pythonmodel.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])history = model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))
💡 小貼士:
adam 是一種優化器,適合初學者使用。
SparseCategoricalCrossentropy 適合標簽是整數而不是 one-hot 的分類任務。
第六步:訓練過程可視化
#pythonplt.plot(history.history['accuracy'], label='訓練準確率')
plt.plot(history.history['val_accuracy'], label='驗證準確率')
plt.xlabel('Epoch'); plt.ylabel('Accuracy')
plt.legend(); plt.grid()
plt.show()
這個圖能直觀看到模型是否在過擬合或欠擬合。
第七步:評估模型
#python
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'測試準確率:{test_acc:.2f}')
第八步:預測和展示結果
#pythonprobability_model = models.Sequential([model, layers.Softmax()])
predictions = probability_model.predict(x_test)#展示前5張圖片及其預測結果
for i in range(5):plt.imshow(x_test[i])plt.title(f"預測:{class_names[np.argmax(predictions[i])]} / 實際:{class_names[y_test[i][0]]}")plt.axis('off')plt.show()
第九步:保存與加載模型
#python
#保存模型
model.save('cifar10_cnn_model.h5')#加載模型
new_model = tf.keras.models.load_model('cifar10_cnn_model.h5')
🔄 擴展建議
訓練貓狗二分類模型(用 Kaggle 的數據集)。
加 BatchNormalization、Dropout 提升泛化能力。
使用更強的預訓練模型如 MobileNet、ResNet。