iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
Python

Python探索之旅:從基礎到實踐系列 第 28

DAY 28: 開啟人工智慧大門——探索 MLP 與手寫數字辨識

  • 分享至 

  • xImage
  •  

今天我們將深入人工智慧領域,專注於神經網絡的基礎——多層感知器(MLP),並實作一個模型來訓練手寫數字圖片辨識。這個課題將帶你領略如何從頭開始搭建並訓練深度學習模型,使用 Python 的強大工具來實現圖片辨識任務。

一、什麼是多層感知器 (MLP)?

多層感知器(MLP)是一種前饋神經網路,是神經網絡的基本結構之一。它包含多層神經元,並且每一層的輸出會傳遞給下一層,這樣的結構讓 MLP 能夠學習更複雜的非線性關係。

MLP 包含三大部分:

1.	輸入層 (Input Layer): 接收數據。
2.	隱藏層 (Hidden Layer): 多層神經元,用來學習數據特徵。
3.	輸出層 (Output Layer): 根據隱藏層的結果做出預測。

二、神經網路的運作原理

1.	前向傳播 (Forward Propagation): 數據從輸入層傳遞到隱藏層,再到輸出層,每層的神經元會加權和激活輸入,最後輸出結果。
2.	損失函數 (Loss Function): 衡量模型預測與實際標籤之間的誤差。
3.	反向傳播 (Backpropagation): 調整每層神經元的權重,使模型的預測逐漸接近真實結果,這個過程是模型學習的核心。

三、Mlp 的操作步驟

  1. 準備數據集

為了展示 MLP 的實際應用,我們將使用 MNIST 數據集,這是一個包含 28x28 手寫數字圖片的數據集,共有 10 個數字(0-9)的類別。可以使用 Keras 或 Scikit-learn 來載入這個數據集。

from tensorflow.keras.datasets import mnist

載入 MNIST 數據集

(x_train, y_train), (x_test, y_test) = mnist.load_data()

將數據展平成一維並進行標準化

x_train = x_train.reshape(x_train.shape[0], 28 * 28).astype('float32') / 255
x_test = x_test.reshape(x_test.shape[0], 28 * 28).astype('float32') / 255

  1. 搭建 MLP 模型

接下來我們將使用 Keras 建立一個簡單的 MLP 模型,這個模型包含三層:輸入層、隱藏層(帶有激活函數),以及輸出層(使用 softmax 作為激活函數來預測 10 個數字類別)。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

建立 MLP 模型

model = Sequential()
model.add(Dense(128, input_shape=(784,), activation='relu')) # 隱藏層
model.add(Dense(64, activation='relu')) # 隱藏層
model.add(Dense(10, activation='softmax')) # 輸出層

  1. 編譯與訓練模型

編譯模型時需要選擇適合的損失函數與優化器,我們使用 categorical_crossentropy 作為損失函數,並且用 Adam 優化器來進行權重調整。訓練過程中,我們會設定批次大小與訓練迭代次數。

編譯模型

model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])

開始訓練模型

model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test))

四、模型訓練:MNIST 手寫數字辨識

我們將利用前述搭建好的 MLP 模型來訓練手寫數字辨識,並觀察模型的預測效果。

  1. 資料預處理

在訓練之前,我們需要對標籤進行 one-hot 編碼處理,這樣可以確保模型的輸出與標籤相匹配。

from tensorflow.keras.utils import to_categorical

將標籤轉換為 one-hot 格式

y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

  1. 訓練過程中的觀察

模型會在每個 epoch 完成後,顯示訓練準確度與驗證準確度,我們可以根據這些數據來調整模型的參數,或者嘗試增加隱藏層的數量來改善模型性能。

五、模型評估與測試

訓練完成後,我們需要對模型進行測試,觀察其在未見過的測試數據上的表現。這樣可以確保模型具有良好的泛化能力。

評估模型在測試數據上的性能

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

模型評估結果中的準確率越高,表示模型對手寫數字的辨識效果越好。

六、使用自定義數據進行測試

為了驗證模型的實際應用,我們還可以從外部獲取手寫數字圖片,將其轉換成適合的數據格式,並使用模型進行預測。

  1. 圖片轉換與預測

如果我們有一張手寫數字的圖片,可以將其處理成 28x28 的灰度圖,然後輸入到我們的模型中進行預測。

from PIL import Image
import numpy as np

載入圖片並轉換為灰度圖

img = Image.open('digit.png').convert('L')
img = img.resize((28, 28))
img_arr = np.array(img).reshape(1, 784).astype('float32') / 255

預測

prediction = model.predict(img_arr)
print('Predicted digit:', np.argmax(prediction))

七、未來擴展:深度學習與強化學習的更多應用

在掌握了 MLP 的基本操作與概念之後,未來可以擴展到更複雜的神經網絡結構,如卷積神經網絡(CNN)和遞歸神經網絡(RNN)。這些網絡可以應用在圖像分類、語音識別、自動駕駛等領域。此外,深度學習與強化學習的結合也可以帶來更多的智能應用場景。

擴展學習:

•	CNN(卷積神經網路):適合處理圖片類型的數據。
•	RNN(遞歸神經網路):適合處理序列數據,例如自然語言處理、時間序列預測。
•	強化學習:使得模型能夠透過與環境互動來學習,應用於遊戲 AI、自動駕駛等。

八、結論

今天的課題涵蓋了神經網路中最基本的 MLP 結構,並結合了 MNIST 手寫數字的實作範例。隨著模型訓練與測試的進行,我們應該已經對人工智慧中的基礎概念與模型建構有了初步的理解。接下來的學習將進一步深入到更複雜的模型結構與應用場景,如自然語言處理、圖像辨識等。


上一篇
DAY 27: 完整專案實作 (II)——功能擴展與代碼優化
系列文
Python探索之旅:從基礎到實踐28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言