由淺入深學(xué)習(xí)TensorFlow MNIST 數(shù)據(jù)集
MNIST 數(shù)據(jù)集介紹
MNIST 包含 0~9 的手寫(xiě)數(shù)字, 共有 60000 個(gè)訓(xùn)練集和 10000 個(gè)測(cè)試集. 數(shù)據(jù)的格式為單通道 28*28 的灰度圖.
LeNet 模型介紹
LeNet 網(wǎng)絡(luò)最早由紐約大學(xué)的 Yann LeCun 等人于 1998 年提出, 也稱(chēng) LeNet5. LeNet 是神經(jīng)網(wǎng)絡(luò)的鼻祖, 被譽(yù)為卷積神經(jīng)網(wǎng)絡(luò)的 “Hello World”.
卷積

池化 (下采樣)

激活函數(shù) (ReLU)

LeNet 逐層分析
1. 第一個(gè)卷積層

2. 第一個(gè)池化層

3. 第二個(gè)卷積層

4. 第二個(gè)池化層

5. 全連接卷積層

6. 全連接層

7. 全連接層 (輸出層)

代碼實(shí)現(xiàn)
導(dǎo)包
from tensorflow.keras.datasets import mnist from matplotlib import pyplot as plt import numpy as np import tensorflow as tf
讀取 & 查看數(shù)據(jù)
# ------------------1. 讀取 & 查看數(shù)據(jù)------------------ # 讀取數(shù)據(jù) (X_train, y_train), (X_test, y_test) = mnist.load_data() # 數(shù)據(jù)集查看 print(X_train.shape) # (60000, 28, 28) print(y_train.shape) # (60000,) print(X_test.shape) # (10000, 28, 28) print(y_test.shape) # (10000,) print(type(X_train)) # <class 'numpy.ndarray'> # 圖片顯示 plt.imshow(X_train[0], cmap="Greys") # 查看第一張圖片 plt.show()
數(shù)據(jù)預(yù)處理
# ------------------2. 數(shù)據(jù)預(yù)處理------------------ # 格式轉(zhuǎn)換 (將圖片從28*28擴(kuò)充為32*32) X_train = np.pad(X_train, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0) X_test = np.pad(X_test, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0) print(X_train.shape) # (60000, 32, 32) print(X_test.shape) # (10000, 32, 32) # 數(shù)據(jù)集格式變換 X_train = X_train.astype(np.float32) X_test = X_test.astype(np.float32) # 數(shù)據(jù)正則化 X_train /= 255 X_test /= 255 # 數(shù)據(jù)維度轉(zhuǎn)換 X_train = np.expand_dims(X_train, axis=-1) X_test = np.expand_dims(X_test, axis=-1) print(X_train.shape) # (60000, 32, 32, 1) print(X_test.shape) # (10000, 32, 32, 1)
模型建立
# 第一個(gè)卷積層 conv_layer_1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu) # 第一個(gè)池化層 pool_layer_1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), padding="same") # 第二個(gè)卷積層 conv_layer_2 = tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu) # 第二個(gè)池化層 pool_layer_2 = tf.keras.layers.MaxPool2D(padding="same") # 扁平化 flatten = tf.keras.layers.Flatten() # 第一個(gè)全連接層 fc_layer_1 = tf.keras.layers.Dense(units=120, activation=tf.nn.relu) # 第二個(gè)全連接層 fc_layer_2 = tf.keras.layers.Dense(units=84, activation=tf.nn.softmax) # 輸出層 output_layer = tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
卷積 Conv2D 的用法:
- filters: 卷積核個(gè)數(shù)
- kernel_size: 卷積核大小
- strides = (1, 1): 步長(zhǎng)
- padding = “vaild”: valid 為舍棄, same 為補(bǔ)齊
- activation = tf.nn.relu: 激活函數(shù)
- data_format = None: 默認(rèn) channels_last

池化 AveragePooling2D 的用法:
- pool_size: 池的大小
- strides = (1, 1): 步長(zhǎng)
- padding = “vaild”: valid 為舍棄, same 為補(bǔ)齊
- activation = tf.nn.relu: 激活函數(shù)
- data_format = None: 默認(rèn) channels_last
全連接 Dense 的用法:
- units: 輸出的維度
- activation: 激活函數(shù)
- strides = (1, 1): 步長(zhǎng)
- padding = “vaild”: valid 為舍棄, same 為補(bǔ)齊
- activation = tf.nn.relu: 激活函數(shù)
- data_format = None: 默認(rèn) channels_last
# 模型實(shí)例化
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu,
input_shape=(32, 32, 1)),
# relu
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu),
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(units=120, activation=tf.nn.relu),
tf.keras.layers.Dense(units=84, activation=tf.nn.relu),
tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
])
# 模型展示
model.summary()
輸出結(jié)果:

訓(xùn)練模型
# ------------------4. 訓(xùn)練模型------------------ # 設(shè)置超參數(shù) num_epochs = 10 # 訓(xùn)練輪數(shù) batch_size = 1000 # 批次大小 learning_rate = 0.001 # 學(xué)習(xí)率
# 定義優(yōu)化器 adam_optimizer = tf.keras.optimizers.Adam(learning_rate) model.compile(optimizer=adam_optimizer,loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
complie 的用法:
- optimizer: 優(yōu)化器
- loss: 損失函數(shù)
- metrics: 評(píng)價(jià)
with tf.Session() as sess:
# 初始化所有變量
init = tf.global_variables_initializer()
sess.run(init)
model.fit(x=X_train,y=y_train,batch_size=batch_size,epochs=num_epochs)
# 評(píng)估指標(biāo)
print(model.evaluate(X_test, y_test)) # loss value & metrics values
輸出結(jié)果:

fit 的用法:
- x: 訓(xùn)練集
- y: 測(cè)試集
- batch_size: 批次大小
- enpochs: 訓(xùn)練遍數(shù)
保存模型
# ------------------5. 保存模型------------------
model.save('lenet_model.h5')
流程總結(jié)

完整代碼
from tensorflow.keras.datasets import mnist
from matplotlib import pyplot as plt
import numpy as np
import tensorflow as tf
# ------------------1. 讀取 & 查看數(shù)據(jù)------------------
# 讀取數(shù)據(jù)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 數(shù)據(jù)集查看
print(X_train.shape) # (60000, 28, 28)
print(y_train.shape) # (60000,)
print(X_test.shape) # (10000, 28, 28)
print(y_test.shape) # (10000,)
print(type(X_train)) # <class 'numpy.ndarray'>
# 圖片顯示
plt.imshow(X_train[0], cmap="Greys") # 查看第一張圖片
plt.show()
# ------------------2. 數(shù)據(jù)預(yù)處理------------------
# 格式轉(zhuǎn)換 (將圖片從28*28擴(kuò)充為32*32)
X_train = np.pad(X_train, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0)
X_test = np.pad(X_test, ((0, 0), (2, 2), (2, 2)), "constant", constant_values=0)
print(X_train.shape) # (60000, 32, 32)
print(X_test.shape) # (10000, 32, 32)
# 數(shù)據(jù)集格式變換
X_train = X_train.astype(np.float32)
X_test = X_test.astype(np.float32)
# 數(shù)據(jù)正則化
X_train /= 255
X_test /= 255
# 數(shù)據(jù)維度轉(zhuǎn)換
X_train = np.expand_dims(X_train, axis=-1)
X_test = np.expand_dims(X_test, axis=-1)
print(X_train.shape) # (60000, 32, 32, 1)
print(X_test.shape) # (10000, 32, 32, 1)
# ------------------3. 模型建立------------------
# 第一個(gè)卷積層
conv_layer_1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu)
# 第一個(gè)池化層
pool_layer_1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), padding="same")
# 第二個(gè)卷積層
conv_layer_2 = tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding="valid", activation=tf.nn.relu)
# 第二個(gè)池化層
pool_layer_2 = tf.keras.layers.MaxPool2D(padding="same")
# 扁平化
flatten = tf.keras.layers.Flatten()
# 第一個(gè)全連接層
fc_layer_1 = tf.keras.layers.Dense(units=120, activation=tf.nn.relu)
# 第二個(gè)全連接層
fc_layer_2 = tf.keras.layers.Dense(units=84, activation=tf.nn.softmax)
# 輸出層
output_layer = tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
# 模型實(shí)例化
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu,
input_shape=(32, 32, 1)),
# relu
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu),
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(units=120, activation=tf.nn.relu),
tf.keras.layers.Dense(units=84, activation=tf.nn.relu),
tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
])
# 模型展示
model.summary()
# ------------------4. 訓(xùn)練模型------------------
# 設(shè)置超參數(shù)
num_epochs = 10 # 訓(xùn)練輪數(shù)
batch_size = 1000 # 批次大小
learning_rate = 0.001 # 學(xué)習(xí)率
# 定義優(yōu)化器
adam_optimizer = tf.keras.optimizers.Adam(learning_rate)
model.compile(optimizer=adam_optimizer,loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
with tf.Session() as sess:
# 初始化所有變量
init = tf.global_variables_initializer()
sess.run(init)
model.fit(x=X_train,y=y_train,batch_size=batch_size,epochs=num_epochs)
# 評(píng)估指標(biāo)
print(model.evaluate(X_test, y_test)) # loss value & metrics values
# ------------------5. 保存模型------------------
model.save('lenet_model.h5')
到此這篇關(guān)于由淺入深學(xué)習(xí)TensorFlow MNIST 數(shù)據(jù)集的文章就介紹到這了,更多相關(guān)TensorFlow MNIST 數(shù)據(jù)集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)AVIF圖片與其他圖片格式間的批量轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了如何使用 Pillow 庫(kù)實(shí)現(xiàn)AVIF與其他格式的相互轉(zhuǎn)換,即將AVIF轉(zhuǎn)換為常見(jiàn)的格式,比如 JPG 或 PNG,需要的小伙伴可以參考下2025-04-04
分享5個(gè)短小精悍的Python趣味腳本,適合小白上手!
這篇文章主要給大家分享介紹了5個(gè)短小精悍的Python趣味腳本,非常適合小白上手,分別包含圖片尺寸縮小、pdf轉(zhuǎn)txt文檔、猜數(shù)字游戲、電池電量告警以及圖片添加水印等腳本,需要的朋友可以參考下2022-02-02
Python使用pyforms實(shí)現(xiàn)輕松構(gòu)建GUI
pyforms是一個(gè)基于Python的GUI框架,它提供了一種簡(jiǎn)單而強(qiáng)大的方式來(lái)構(gòu)建圖形用戶界面,本文將介紹pyforms的使用場(chǎng)景、優(yōu)勢(shì)以及常用的Python代碼案例,需要的小伙伴可以了解下2024-01-01
手寫(xiě)一個(gè)python迭代器過(guò)程詳解
這篇文章主要介紹了手寫(xiě)一個(gè)python迭代器過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python實(shí)現(xiàn)字典排序、按照l(shuí)ist中字典的某個(gè)key排序的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)字典排序、按照l(shuí)ist中字典的某個(gè)key排序的方法,涉及Python字典與列表排序相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
PyTorch讀取Cifar數(shù)據(jù)集并顯示圖片的實(shí)例講解
今天小編就為大家分享一篇PyTorch讀取Cifar數(shù)據(jù)集并顯示圖片的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
利用python實(shí)現(xiàn)短信和電話提醒功能的例子
今天小編就為大家分享一篇利用python實(shí)現(xiàn)短信和電話提醒功能的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

