深度學習:多層感知機


深度學習:多層感知機

1 概述

(1)基礎環境

  • python3.8.12
  • tensorflow2.7.0

(2)多層感知機概述

  • 多層感知器(Multilayer Perceptron,縮寫MLP)是一種前向結構的人工神經網絡,映射一組輸入向量到一組輸出向量。
  • MLP可以被看作是一個有向圖,由多個的節點層所組成,每一層都全連接到下一層。
  • 除了輸入節點,每個節點都是一個帶有非線性激活函數的神經元(或稱處理單元)。
  • 它首先學習,然后使用權重存儲數據,並使用算法來調整權重並減少訓練過程中的偏差,即實際值和預測值之間的誤差。
  • 基本結構:輸入層 -> 中間隱藏層 -> 輸出層。

2 數字識別(mnist)基礎步驟

  • 使用 tf.keras.datasets 獲得數據集並預處理
  • 使用 tf.keras.Modeltf.keras.layers 構建模型

  • 構建模型訓練流程,使用 tf.keras.losses 計算損失函數,並使用 tf.keras.optimizer 優化模型
  • 構建模型評估流程,使用 tf.keras.metrics 計算評估指標

3 模型訓練與導出模型

import tensorflow as tf
import numpy as np

# 數據加載類
class MNISTLoader():
    def __init__(self):
        # 下載訓練數據和測試數據
        mnist = tf.keras.datasets.mnist
        (self.train_data, self.train_label), (self.test_data, self.test_label) = mnist.load_data()
        # MNIST中的圖像默認為uint8(0-255的數字)。以下代碼將其歸一化到0-1之間的浮點數,並在最后增加一維作為顏色通道
        # [60000, 28, 28, mnist]
        self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)
        # [10000, 28, 28, mnist]
        self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)
        # [60000]
        self.train_label = self.train_label.astype(np.int32)
        # [10000]
        self.test_label = self.test_label.astype(np.int32)
        self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]

    def get_batch(self, batch_size):
        # 從數據集中隨機取出batch_size個元素並返回
        index = np.random.randint(0, self.num_train_data, batch_size)
        return self.train_data[index, :], self.train_label[index]

num_epochs = 5 # 迭代次數
batch_size = 50 # 批量大小
learning_rate = 0.001 # 學習率

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(), # 28 * 28 * 1 --打平--> 784
    tf.keras.layers.Dense(100, activation=tf.nn.relu), # 784 -f(AW+b)線性變換 + Relu激活函數-> 100
    tf.keras.layers.Dense(10), # 100 --f(AW+b)線性變換--> 10
    tf.keras.layers.Softmax() # softmax函數凸顯原始向量中最大的值並抑制遠低於最大值的其他分量
])

data_loader = MNISTLoader()
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), # 優化器:Adam優化器
    loss=tf.keras.losses.sparse_categorical_crossentropy, # 損失函數:交叉熵
    metrics=[tf.keras.metrics.sparse_categorical_accuracy] # 評估指標
)
# 訓練模型
model.fit(data_loader.train_data, data_loader.train_label, epochs=num_epochs, batch_size=batch_size)
# 導出模型
tf.saved_model.save(model, "saved/mnist")

4 模型導入與預測

(1)導入模型並測試性能

# 導入模型並測試性能
batch_size = 50
model = tf.saved_model.load("saved/mnist")
data_loader = MNISTLoader()
sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()
num_batches = int(data_loader.num_test_data // batch_size)
for batch_index in range(num_batches):
    start_index, end_index = batch_index * batch_size, (batch_index + 1) * batch_size
    y_pred = model(data_loader.test_data[start_index: end_index])
    sparse_categorical_accuracy.update_state(y_true=data_loader.test_label[start_index: end_index], y_pred=y_pred)
print("test accuracy: %f" % sparse_categorical_accuracy.result())

(2)導入模型並使用真實圖像預測

import tensorflow as tf
import numpy as np

from PIL import Image
from PIL import ImageEnhance
import PIL.ImageOps as ImageOps

model = tf.saved_model.load("saved/mnist")
img = Image.open("./image2.jpeg") # 讀取圖片
img = ImageEnhance.Contrast(img).enhance(factor=10) # 鉛筆書寫和光線問題:需進行圖片增強,調整對比度,不調整會預測為3。
img = img.convert("L") # 灰度處理
img = img.resize((28, 28)) # 調整圖片大小
img = ImageOps.invert(img) # 反轉顏色,需要黑底白字的圖片
img = np.expand_dims(np.asarray(img) / 255.0, axis=-1) # 歸一化

model = tf.saved_model.load("saved/mnist") # 加載模型
predict_y = model([img]) # 預測結果
print(np.argmax(predict_y[0])) # 獲取最大值作為預測結果值

5 參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM