6.5.2

三 手写数字识别

MNIST 数据集样例图片

3.2 神经网络的推理处理

• 输入层784个神经元（flatten=true 每张图片展开成一位数组）

• 输出层10个神经元（10个类别，0~9）

• 两个隐藏层，第一个隐藏层有256个神经元，第二个隐藏层有128个神经元，256和128可以设置成任意值

3.3 代码实现

3.3.1 模块准备

``````import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets
import numpy as np
import matplotlib.pyplot as plt``````

3.3.1 数据准备并预处理

``````# 读取数据集
(x, y), (x_val, y_val) = datasets.mnist.load_data()
# 转换成浮点型张量，并映射到[-1, 1]区间
x = 2 * tf.convert_to_tensor(x, dtype=tf.float32) / 255. - 1
# 转换成整型张量
y = tf.convert_to_tensor(y, dtype=tf.int32)
# one-hot编码
y = tf.one_hot(y, depth=10)
# 改变视图  [b, 28, 28]  =>  [b, 28*28]
x = tf.reshape(x, [-1, 28*28])``````

3.3.2 神经网络层参数准备

``````# 首先创建每个非线性层的W和b张量参数
# 每层的张量都需要被优化，故使用Variable类型，并使用截断的正态分布初始化权值张量
# 偏置向量初始化为0即可
# 第一层的参数
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
# 第二层的参数
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
b2 = tf.Variable(tf.zeros(128))
# 第三层的参数
w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))``````

print(f"w1.shape = {w1.shape} b1.shape = {b1.shape}")

print(f"w2.shape = {w2.shape} b2.shape = {b2.shape}")

print(f"w3.shape = {w3.shape} b3.shape = {b3.shape}")

w1.shape = (784, 256) b1.shape = (256,) w2.shape = (256, 128) b2.shape = (128,) w3.shape = (128, 10) b3.shape = (10,)

3.3.3 训练参数设置

``````# 设置训练次数epochs及学习率lr
epochs = 100
lr = 0.01
# 记录每次的损失
list_loss = np.zeros([epochs])
list_epoch = np.arange(epochs)``````

3.3.4 数据训练

``````for epoch in range(epochs):
with tf.GradientTape() as tape:  # 构建梯度记录环境
# 第一层计算 [b, 784]@[784, 256]+[256] => [b, 256]+[256] => [b,256]+[b, 256]
h1 = x@w1 + tf.broadcast_to(b1, [x.shape[0], 256])
h1 = tf.nn.relu(h1)  # 通过激活函数
# 第二层计算 [b, 256] => [b, 128]
h2 = h1@w2 + b2
h2 = tf.nn.relu(h2)
# 输出层计算 [b, 128] => [b, 10]
out = h2@w3 + b3
# 计算y与out的均方差
loss = tf.square(y - out)
loss = tf.reduce_mean(loss)
list_loss[epoch] = loss
# 自动梯度，需要求梯度的张量有[w1,b1,w2,b2,w3,b3]

3.3.5 运行结果

``````plt.plot(list_epoch, list_loss)
plt.title('MINST neural networks model')
plt.xlabel('Epoch')
plt.ylabel('MSE')
plt.show()``````

THE END

)">