全连接神经网络案例——手写数字识别

文章目录

使⽤⼿写数字的MNIST数据集如上图所示,该数据集包含60,000个⽤于训练的样本和10,000个⽤于测试的样本,图像是固定⼤⼩(28x28像素),其值为0到255。

整个案例的实现流程是:

  • 数据加载
  • 数据处理
  • 模型构建
  • 模型训练
  • 模型测试
  • 模型保存

1.我们导入需要的工具包

python 复制代码
# 1.导入所需的工具包
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# 构建模型
from tensorflow.keras.models import Sequential
# 相关的网络层
from tensorflow.keras.layers import Dense, Dropout, Activation, BatchNormalization
# 导入辅助工具包
from tensorflow.keras import utils
# 正则化
from tensorflow.keras import regularizers
# 数据集
from tensorflow.keras.datasets import mnist

2.数据加载

首先我们加载手写数字图像

python 复制代码
# 2.数据加载
# 加载数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)

数据展示:

3.数据处理

神经⽹络中的每个训练样本是⼀个向量,因此需要对输⼊进⾏重塑,使每个28x28的图像成为⼀个的784维向量。另外,将输⼊数据进⾏归⼀化处理,从0-255调整到0-1。

另外对于⽬标值我们也需要进⾏处理,将其转换为热编码的形式(本):

python 复制代码
# 3.数据处理
# 数据维度的调整
x_train = x_train.reshape(60000, 784)
x_test = x_test(10000, 784)
# 数据类型调整
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
# 归一化
x_train = x_train/255
x_test = x_test/255
# 将目标值转换成热编码的形式
y_train = utils.to_categorical(y_train, 10)
y_test = utils.to_categorical(y_test, 10)

4.模型构建

在这⾥我们构建只有3层全连接的⽹络来进⾏处理:

构建模型如下所示:

python 复制代码
# 4.模型构建
# 使用序列模型进行构建
model = Sequential()
# 全连接层,2个隐藏层,一个输出层
# 第一个隐藏层,512个神经元,先BN再激活,随机失活
model.add(Dense(512, input_shape=(784,)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
# 第二个隐藏层,512个神经元,先BN再激活,随机失活
model.add(Dense(512, kernel_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
# 输出层
model.add(Dense(10, activation='softmax'))
# 查看模型架构
model.summary()

5.模型编译

设置模型训练使⽤的损失函数交叉熵损失和优化⽅法adam,损失函数⽤来衡量预测值与真实值之间的差异,优化器⽤来使⽤损失函数达到最优:

python 复制代码
# 5.模型编译
# 损失函数(交叉熵损失),优化器,评价指标
model.compile(loss=tf.keras.losses.categorical_crossentropy, optimizer=tf.keras.optimizers.Adam(),
              metrics=tf.keras.metrics.Accuracy())

6.模型训练

python 复制代码
# 6.模型训练
# 使用fit,指定训练集,epochs,batch_size,val,verbose
history = model.fit(x_train, y_train, epochs=4, batch_size=128, validation_data=(x_test, y_test), verbose=1)

我们将损失绘制成曲线:

python 复制代码
# 绘制损失函数
plt.figure()
plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='val')
plt.legend()
plt.grid()
plt.show()

我们再来绘制一下准确率变化曲线:

python 复制代码
# 绘制准确率变化曲线
plt.figure()
plt.plot(history.history['accuracy'], label='train')
plt.plot(history.history['val_accuracy'], label='val')
plt.legend()
plt.grid()
plt.show()

其中,history会保存loss的变化和在compile中指定的评价指标的结果。

7.模型测试

python 复制代码
# 7.模型测试
model.evaluate(x_test, y_test, verbose=1)

8.模型保存

python 复制代码
# 8.模型保存
model.save("my_model.h5")

之后要是想要想在这个模型时,只需要使用model = tf.keras.models.load_model('my_model.h5')即可。

相关推荐
Shang1809893572621 分钟前
T41LQ 一款高性能、低功耗的系统级芯片(SoC) 适用于各种AIoT应用智能安防、智能家居方案优选T41L
人工智能·驱动开发·嵌入式硬件·fpga开发·信息与通信·信号处理·t41lq
Bony-32 分钟前
用于糖尿病视网膜病变图像生成的GAN
人工智能·神经网络·生成对抗网络
罗西的思考42 分钟前
【Agent】 ACE(Agentic Context Engineering)源码阅读笔记---(3)关键创新
人工智能·算法
Elastic 中国社区官方博客1 小时前
通过混合搜索重排序提升多语言嵌入模型的相关性
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
猫头虎1 小时前
昆仑芯 X HAMi X 百度智能云 | 昆仑芯 P800 XPU/vXPU 双模式算力调度方案落地
人工智能·百度·开源·aigc·文心一言·gpu算力·agi
大千AI助手1 小时前
探索LoSA:动态低秩稀疏自适应——大模型高效微调的新突破
人工智能·神经网络·lora·大模型·llm·大千ai助手·稀疏微调
说私域1 小时前
“开源链动2+1模式AI智能名片S2B2C商城小程序”在拉群营销中的应用与效果
人工智能·小程序
Python图像识别2 小时前
75_基于深度学习的咖啡叶片病害检测系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo
PyAIGCMaster2 小时前
钉钉的设计理念方面,我可以学习
人工智能·深度学习·学习·钉钉
sensen_kiss2 小时前
INT305 Machine Learning 机器学习 Pt.5 神经网络(Neural network)
人工智能·神经网络·机器学习