前言
在昨天的內容中,我們建立了一個卷積神經網路(CNN),並了解了各層的作用與模型的結構。今天,我們將進一步進行模型的編譯與訓練,並且觀察其性能表現。透過使用 MNIST 手寫數字資料集進行訓練,我們將完整地走過深度學習模型的建立、訓練、評估與可視化過程。這個流程將是大家接觸深度學習的第一步,是所謂的 Hello World! 範例,期待大家跟著我一起完成這個基礎模型。
程式碼
- 編譯模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
這段程式碼是在配置模型的編譯過程,定義了模型的優化器、損失函數和評估指標。
- model.compile() 用於編譯模型,是在訓練模型之前的必要步驟。這個過程會將模型配置為訓練所需的狀態。
- 參數解析
- optimizer='adam':
- 作用:指定模型使用 Adam 優化器進行訓練。
- Adam:是一種結合了 AdaGrad 和 RMSProp 的優化演算法,它具有自動調整學習率的特性,對於不同的參數可以根據歷史梯度動態調整學習率,因此通常在各種應用中表現出色。
- loss='sparse_categorical_crossentropy':
- 作用:指定模型的損失函數為 sparse_categorical_crossentropy。
- Sparse Categorical Crossentropy:是一種用於多分類問題的損失函數,當標籤是整數形式(如 0, 1, 2)而不是 one-hot 編碼時,使用這個損失函數。這個損失函數會根據預測值和真實標籤之間的差異來計算損失,從而指導模型的訓練過程。
- metrics=['accuracy']:
- 作用:指定模型在訓練和評估過程中要跟蹤的指標為 accuracy(準確率)。
- Accuracy:準確率指的是模型預測正確的樣本佔總樣本的比例。在多分類問題中,準確率是衡量模型性能的常見指標。
- 訓練模型
history = model.fit(train_images, train_labels, epochs=5,
validation_data=(test_images, test_labels))
- history = model.fit(...)這行程式碼開始訓練模型。這個模型將使用給定的訓練資料進行多輪訓練,並在每一輪(epoch)後評估模型的表現。
- 參數說明
- train_images:
- 這是訓練集的影像資料。每一個影像是模型的輸入。形狀為 (60000, 28, 28, 1),表示有 60,000 張大小為 28x28 像素的灰度圖像。
- train_labels:
- 這是訓練集的標籤資料,對應 train_images 中每張圖像的正確類別。形狀為 (60000,),表示 60,000 個類別標籤。
- epochs=5:
- 設定訓練的輪數(epochs)。在我的這個例子中,模型會遍歷訓練資料 5 次。Epoch:每個 epoch 表示模型已經完整地遍歷了一次整個訓練數據集。
- validation_data=(test_images, test_labels):
- 提供驗證集資料,這些資料不會參與訓練,但會在每個 epoch 結束後用來評估模型的性能。
- test_images:形狀為 (10000, 28, 28, 1),是驗證集的影像資料。
- test_labels:形狀為 (10000,),是驗證集的標籤資料。
- history 物件
- history 物件記錄了模型訓練過程中的所有細節,如每個 epoch 的損失值(loss)、準確率(accuracy)、驗證損失(validation loss)和驗證準確率(validation accuracy)。
運行完成後會看到下面的畫面
這段訓練結果顯示,隨著 epoch 的增加,模型的訓練準確率和驗證準確率逐漸提高,損失值逐漸降低。
3. 評估模型
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f'\nTest accuracy: {test_acc}')
- 程式碼解釋
- 這個方法用於評估模型在測試資料集上的表現。test_images 是測試圖像,test_labels 是對應的標籤。
- evaluate 方法會返回兩個值:測試損失(test_loss)和測試準確率(test_acc)。
- verbose=2 表示在評估過程中打印每個批次的進度資訊,數字越高資訊越詳細。
313/313 - 1s - 3ms/step - accuracy: 0.9933 - loss: 0.0225
Test accuracy: 0.9933000206947327
- 評估過程的輸出解釋
- 313/313:表示測試集被分成了 313 個批次進行評估。
- 1s - 3ms/step:整個評估過程花費了 1 秒,每個批次平均花費 3 毫秒。
- accuracy: 0.9933 和 loss: 0.0225:模型在測試資料上的準確率為 99.33%,損失值為 0.0225。這表示模型在未見過的測試資料上具有非常高的準確性。
- Test accuracy: 0.9933000206947327:最後再次打印出測試資料的準確率,精確到小數點後多位,進一步確認了模型的精度。
- 匯出圖表
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.ylim([0, 1])
plt.legend(loc='lower right')
plt.show()
- 這張圖片是一個顯示模型訓練過程中準確度變化的折線圖。橫軸表示訓練的
Epoch
,縱軸表示準確度(Accuracy)。圖中有兩條曲線:
- 藍色曲線(accuracy):代表訓練數據集的準確度隨著Epoch增加的變化情況。
- 橙色曲線(val_accuracy):代表驗證數據集的準確度隨著Epoch增加的變化情況。
在圖表中,如果你觀察到 accuracy 持續增長,最終達到很高的準確率,而 val_accuracy 早早達到穩定,甚至開始下降,這表示模型在訓練資料上表現良好,但在驗證資料上卻表現不佳,這是典型的過度擬合徵兆。過度擬合發生時,模型會過度學習訓練集中的細節和噪聲,而不是學習一般性的模式。
在這個圖表中,我們可以看到,隨著 Epoch 增加,訓練集的準確率(藍色曲線)和驗證集的準確率(橙色曲線)都在逐漸提高,但橙色曲線的提升速度比藍色曲線要慢。這表明模型正在學習,但尚未出現明顯的過度擬合問題。當然,如果進一步增加 Epoch,可能會開始看到 val_accuracy 的變化停滯,這時就需要考慮調整模型的結構或引入正則化技術來減少過度擬合的風險。
結語
今天我們成功編譯並訓練了這個簡單的卷積神經網路模型,並且取得了不錯的準確率。我們還透過圖表將模型在訓練過程中的表現可視化,這樣的練習讓我們熟悉了模型編譯、訓練與評估的步驟。然而,僅僅訓練一個模型是不夠的,接下來我們將修改模型結構,並嘗試讓這個模型能夠識別我們自己的圖片,這將是明天的挑戰!敬請期待!