深度學習:多層感知機
1 概述
(1)基礎環境
- python3.8.12
- tensorflow2.7.0
(2)多層感知機概述
- 多層感知器(Multilayer Perceptron,縮寫MLP)是一種前向結構的人工神經網絡,映射一組輸入向量到一組輸出向量。
- MLP可以被看作是一個有向圖,由多個的節點層所組成,每一層都全連接到下一層。
- 除了輸入節點,每個節點都是一個帶有非線性激活函數的神經元(或稱處理單元)。
- 它首先學習,然后使用權重存儲數據,並使用算法來調整權重並減少訓練過程中的偏差,即實際值和預測值之間的誤差。
- 基本結構:輸入層 -> 中間隱藏層 -> 輸出層。
2 數字識別(mnist)基礎步驟
- 使用
tf.keras.datasets
獲得數據集並預處理
- 使用
tf.keras.Model
和 tf.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 參考資料