功能概述
這段代碼實現了一個基于TensorFlow和Keras的MNIST手寫數字識別模型。主要功能包括:
- 加載并預處理MNIST數據集
- 構建一個簡單的全連接神經網絡模型
- 訓練模型并評估其性能
- 使用訓練好的模型進行預測
- 保存和加載模型
代碼解析
1. 導入必要的庫
import matplotlib
import tensorflow.keras as keras
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from pasta.augment import inline
- 導入TensorFlow和Keras用于構建和訓練神經網絡
- 導入NumPy用于數值計算
- 導入Matplotlib用于數據可視化
- 從pasta.augment導入inline用于在Jupyter Notebook中直接顯示圖像
2. 打印TensorFlow版本
print(tf.__version__)
輸出當前使用的TensorFlow版本,用于環境檢查。
3. 加載MNIST數據集
path = '../doc/mnist.npz'
with np.load(path) as data:x_train, y_train = data['x_train'], data['y_train']x_test, y_test = data['x_test'], data['y_test']
print(x_train[0])
- 從本地文件加載MNIST數據集
- 數據集包含訓練集(x_train, y_train)和測試集(x_test, y_test)
- 打印第一個訓練樣本的像素值
4. 數據可視化
%matplotlib inline
plt.imshow(x_train[0], cmap=plt.cm.binary)
plt.show()
- 使用Matplotlib顯示第一個訓練樣本的圖像
cmap=plt.cm.binary
設置為黑白顯示
5. 打印第一個訓練樣本的標簽
print(y_train[0])
輸出第一個訓練樣本對應的數字標簽。
6. 數據歸一化
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
print(x_train[0])
- 對圖像數據進行歸一化處理,將像素值縮放到0-1范圍
- 打印歸一化后的第一個訓練樣本
7. 構建神經網絡模型
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
- 創建一個Sequential模型
- 添加Flatten層將28x28的圖像展平為784維向量
- 添加兩個全連接層(Dense),每層128個神經元,使用ReLU激活函數
- 添加輸出層,10個神經元對應10個數字類別,使用Softmax激活函數
8. 編譯模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
- 使用Adam優化器
- 使用稀疏分類交叉熵作為損失函數
- 使用準確率作為評估指標
9. 訓練模型
model.fit(x_train, y_train, epochs=3)
- 訓練模型3個epoch
- 使用訓練數據進行擬合
10. 評估模型
val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss)
print(val_acc)
- 在測試集上評估模型性能
- 輸出測試損失和準確率
11. 使用模型進行預測
predictions = model.predict(x_test)
print(predictions)
print(np.argmax(predictions[0]))
plt.imshow(x_test[0], cmap=plt.cm.binary)
plt.show()
- 對測試集進行預測
- 打印預測結果(概率分布)
- 使用argmax獲取第一個測試樣本的預測標簽
- 顯示第一個測試樣本的圖像
12. 保存和加載模型
def softmax_v2(x):return tf.keras.activations.softmax(x)new_model = tf.keras.models.load_model('epic_num_reader.model.keras',custom_objects={'softmax_v2': softmax_v2}
)predictions = new_model.predict(x_test)
print(np.argmax(predictions[0]))
- 定義一個softmax_v2函數用于兼容性
- 加載之前保存的模型
- 使用加載的模型進行預測
總結
這段代碼實現了一個簡單但有效的MNIST手寫數字分類器。主要特點包括:
- 使用全連接神經網絡結構
- 實現了數據預處理和歸一化
- 達到了較高的測試準確率(約97%)
- 包含了模型保存和加載功能
- 提供了可視化工具檢查數據和預測結果
demo001.ipynb
# 導入 keras 模塊
import matplotlib
import tensorflow.keras as keras
# 導入 tensorflow 模塊
import tensorflow as tf
# 導入 pasta 模塊中的 augment 和 inline 子模塊
from pasta.augment import inline# 打印 TensorFlow 的版本
print(tf.__version__)# 指定本地文件路徑
path = '../doc/mnist.npz'
# 導入 numpy 模塊
import numpy as np
# 從本地加載 MNIST 數據集
with np.load(path) as data:x_train, y_train = data['x_train'], data['y_train']x_test, y_test = data['x_test'], data['y_test']
# 打印訓練數據集的第一個樣本
print(x_train[0])# 導入 matplotlib.pyplot 模塊
import matplotlib.pyplot as plt
# 使用 inline 后,圖形將直接顯示在 Jupyter Notebook 中
# %matplotlib inline
# 可視化訓練數據集的第一個樣本
plt.imshow(x_train[0], cmap=plt.cm.binary)
plt.show()# 打印訓練標簽的第一個樣本
print(y_train[0])# 對訓練和測試數據進行歸一化處理
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)# 打印歸一化后的訓練數據集的第一個樣本
print(x_train[0])# 可視化歸一化后的訓練數據集的第一個樣本
plt.imshow(x_train[0], cmap=plt.cm.binary)
plt.show()# 創建一個 Sequential 模型
model = tf.keras.models.Sequential()
# 添加一個 Flatten 層,用于將輸入數據展平
model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
# 添加一個 Dense 層,包含 128 個神經元,使用 ReLU 激活函數
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
# 再添加一個 Dense 層,配置同上
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
# 添加一個 Dense 層,包含 10 個神經元,使用 Softmax 激活函數
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
# 編譯模型,指定優化器、損失函數和評估指標
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 訓練模型
model.fit(x_train, y_train, epochs=3)
# 評估模型
val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss)
print(val_acc)# 使用模型進行預測
predictions = model.predict(x_test)
print(predictions)# 導入 numpy 模塊
import numpy as np# 打印第一個測試樣本的預測標簽
print(np.argmax(predictions[0]))# 可視化第一個測試樣本
plt.imshow(x_test[0], cmap=plt.cm.binary)
plt.show()# 保存模型
def softmax_v2(x):# 將 softmax_v2 映射到標準 softmaxreturn tf.keras.activations.softmax(x)# 加載之前保存的模型
new_model = tf.keras.models.load_model('epic_num_reader.model.keras',custom_objects={'softmax_v2': softmax_v2}
)# 使用加載的模型進行預測
predictions = new_model.predict(x_test)
# 打印第一個測試樣本的預測標簽
print(np.argmax(predictions[0]))