⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计4077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/
神经网络手写数字识别
- 神经网络手写数字识别
- 一、任务需求
- 二、任务目标
- 1、掌握神经网络的构建
- 2、掌握神经网络的编译
- 3、掌握神经网络的训练
- 4、掌握神经网络的概要输出
- 5、掌握神经网络的模型封装
- 三、任务环境
- 1、jupyter开发环境
- 2、python3.6
- 3、tensorflow2.4
- 四、任务实施过程
- 五、任务小结
神经网络手写数字识别
一、任务需求
MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,这些数字已经过尺寸标准化并位于图像中心,图像是固定大小(28x28像素)。每个样本都是一张28 * 28像素的灰度手写数字图片,其中每一张图片都代表0~9中的一个数字。
要求:利用Sequential模型神经网络使用Tensorflow手写数字识别模型构建与输出
二、任务目标
1、掌握神经网络的构建
2、掌握神经网络的编译
3、掌握神经网络的训练
4、掌握神经网络的概要输出
5、掌握神经网络的模型封装
三、任务环境
1、jupyter开发环境
2、python3.6
3、tensorflow2.4
四、任务实施过程
1、导入灰度图数字识别所用到的模块
# 导入所需模块
import tensorflow as tf
from matplotlib import pyplot as plt
2、加载图片识别用到的训练集和测试集
# 导入数据,分别为训练集和测试集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
3、可视化训练集输入特征的第一个元素
plt.imshow(x_train[0], cmap='gray') # 绘制灰度图
plt.show()
4、打印出训练集输入特征的第一个元素
# 打印出训练集输入特征的第一个元素
print("x_train[0]:\n", x_train[0])
x_train[0]:
[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 3 18 18 18 126 136
175 26 166 255 247 127 0 0 0 0]
[ 0 0 0 0 0 0 0 0 30 36 94 154 170 253 253 253 253 253
225 172 253 242 195 64 0 0 0 0]
[ 0 0 0 0 0 0 0 49 238 253 253 253 253 253 253 253 253 251
93 82 82 56 39 0 0 0 0 0]
[ 0 0 0 0 0 0 0 18 219 253 253 253 253 253 198 182 247 241
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 80 156 107 253 253 205 11 0 43 154
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 14 1 154 253 90 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 139 253 190 2 0 0 0
0 0 0 0 0 0 0 0 0 0]
...
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0]]
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
5、打印出训练集标签的第一个元素
# 打印出训练集标签的第一个元素
print("y_train[0]:\n", y_train[0])
y_train[0]:
5
6、打印出整个训练集输入特征形状
# 打印出整个训练集输入特征形状
print("x_train.shape:\n", x_train.shape)
x_train.shape:
(60000, 28, 28)
7、打印出整个训练集标签的形状
print("y_train.shape:\n", y_train.shape)
y_train.shape:
(60000,)
8、打印出整个测试集输入特征的形状
print("x_test.shape:\n", x_test.shape)
x_test.shape:
(10000, 28, 28)
9、打印出整个测试集标签的形状
print("y_test.shape:\n", y_test.shape)
y_test.shape:
(10000,)
10、数据集的归一化处理
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
11、Sequential神经网络模型构建,分别为拉直层、全连接层128个神经元,激活函数为relu。10个全连接输出,激活函数为softmax。
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
12、模型编译,优化器为adm,损失函数为带softmax的交叉熵,评价函数为准确率。
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
13、模型训练,喂入的数据为5个批次,每个批次32条数据。校验的数据为训练集。检验的频率为1个批次
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
Epoch 1/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.4221 - sparse_categorical_accuracy: 0.8801 - val_loss: 0.1338 - val_sparse_categorical_accuracy: 0.9594
Epoch 2/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.1173 - sparse_categorical_accuracy: 0.9652 - val_loss: 0.1107 - val_sparse_categorical_accuracy: 0.9669
Epoch 3/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.0789 - sparse_categorical_accuracy: 0.9762 - val_loss: 0.0804 - val_sparse_categorical_accuracy: 0.9759
Epoch 4/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.0567 - sparse_categorical_accuracy: 0.9827 - val_loss: 0.0761 - val_sparse_categorical_accuracy: 0.9756
Epoch 5/5
1875/1875 [==============================] - 8s 5ms/step - loss: 0.0441 - sparse_categorical_accuracy: 0.9864 - val_loss: 0.0710 - val_sparse_categorical_accuracy: 0.9777
<tensorflow.python.keras.callbacks.History at 0x7f5445b697b8>
14、模型概要,输出模型的参数信息。
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten_2 (Flatten) (None, 784) 0
_________________________________________________________________
dense_4 (Dense) (None, 128) 100480
_________________________________________________________________
dense_5 (Dense) (None, 10) 1290
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________
可以看到,模型的参数一共101770个。计算方式为:1282828 +128 + 10*128+10
15、使用类来封装模型
from tensorflow.keras import Model
from tensorflow.keras.layers import Dense, Flatten
class MnistModel(Model):
def __init__(self):
super(MnistModel, self).__init__()
self.flatten = Flatten()
self.d1 = Dense(128, activation='relu')
self.d2 = Dense(10, activation='softmax')
def call(self, x):
x = self.flatten(x)
x = self.d1(x)
y = self.d2(x)
return y
16、创建模型
model = MnistModel()
17、构型编译、训练和模型概要输出方式和上面的方式一样
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()
五、任务小结
本节我们通过Sequential模型,构建神经网络来实现手写数字的识别任务。首先我们查看了手写数字的训练集和测试集的数量和维度,查看了训练集的第一张图片的样式。同时打印输出了训练集和测试集的第一个元素。其次我们按照神经网络构建的步骤,进行了模型的构建、模型训练、模型概要输出。最后我们对模型进行了封装,也进行了模型构建、训练和概要输出。可以看到使用封装和不使用封装的方式模型概要输出的内容是一样的。通过本任务我们需要掌握使用神经网络的步骤。掌握全连接网络的构建方式。
–end–