深度学习快速入门项目教程-基于keras的手写数字识别

本文介绍了使用Python3.11和Keras2.15版本在PyCharm中完成的一个新手项目,涵盖了数据加载、模型构建、训练、预处理、评估等步骤,展示了如何使用Sequential模型和相关层构建和训练MNIST分类器。
摘要由CSDN通过智能技术生成

前言

        本项目是基于python3.11,keras2.15版本在pycharm中进行的,属于新手必做项目,本文用目前较新的python及其库的版本,演示了具体流程。

导入所需库及工具包

# 导入相关工具包
import numpy as np
# import tensorflow as tf
import keras
import matplotlib.pyplot as plt
# 导入数据集
from keras.datasets import mnist
# 构建序列模型
from keras.models import Sequential
# 导入需要的层
from keras.layers import Dense, Dropout, Activation, BatchNormalization
# 导入辅助工具包
from keras import utils
from keras import regularizers

        numpy库以及matplotlib库在数据分析及可视化中必不可少的,用于后续的数据处理部分,注意在当前版本下,是不需要从tensorflow中导入keras的,而是直接导入keras库。

数据加载

        mnist数据集共有从0-9共10个类别标签,先定义出来,方便使用,数据集的load_data函数自动将数据集分为训练集与测试集,为了对数据集有一个直观印象,可以将数据集中x_train的shape属性打印出来是(60000,28,28),60000表示一共有60000张图片,28表示每张图片的长和宽各有28个像素,并且可以用subplot()函数绘制数据集的前九张图,结果如图1所示,可以在pycharm中的sciview中查看。

# 数据加载
# 定义类别数
num_classes = 10
(x_train , y_train) , (x_test , y_test) = mnist.load_data()
# 打印输出数据集的维度
# print("训练样本初始维度:",x_train.shape)
# print(x_train)
# 数据展示
for i in range(9):
    plt.subplot(3,3,i+1)
    plt.subplots_adjust(hspace=0.5)
    plt.imshow(x_train[i],cmap = 'gray',interpolation = 'none')
    plt.title("number{}".format(y_train[i]))
plt.show()

图1 mnist前9张图像

数据预处理

因为模型仅支持向量形式,所以要对数据原来的shape属性进行更改,采用reshape函数,将其变为(60000,784)的向量,并且将向量中的每个元素改为float型,因为图片是灰度图的形式,每个元素的范围是0~255,对其进行规范化处理,每个元素除以255,再将目标值转换为热编码的形式。

# 数据处理
# 格式转换
x_train = x_train.reshape(60000 , 784)
x_test = x_test.reshape(10000 , 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')

# 标准化
x_train /= 255
x_test /= 255
# print("训练样本维度:",x_train.shape)
# 将目标值转换为热编码的形式
y_train = utils.to_categorical(y_train,num_classes)
y_test = utils.to_categorical(y_test,num_classes)
# print("目标值维度:",y_test.shape)
# print(y_test )

模型搭建

模型搭建采用的是Sequential模型,主要包括两个隐层,一个输出层,两个隐层中又分别添加了BN层,激活函数都为ReLu。BN与激活函数的顺序可以调换,再以0.2的概率随机失活一部分神经元,最后输出层选择激活函数为softmax,model.summary()函数可以展示模型结构,如图2所示。

# 模型搭建
model = Sequential()
# 全连接层,两个隐层,一个输出层
# 第一个隐层,512个神经元,先激活后BN,激活函数为RELU,以0.2的概率随机失活
model.add(Dense(512,activation = "relu",input_shape=(784,)))
model.add(BatchNormalization())
model.add(Dropout(0.2))
# 第二个隐层,512个神经元,先BN后激活,激活函数为RELU,以0.2的概率随机失活
model.add(Dense(512,kernel_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(Activation("relu"))
model.add(Dropout(0.2))
# 输出层,10个神经元,激活函数为softmax
model.add(Dense(10,activation = "softmax"))
#模型展示
print(model.summary())
# utils.plot_model(model,show_shapes=True,to_file="model.svg",dpi=None)

图2 模型结构

模型结构也可以用utils.plot_model()绘制 ,前提是要安装pydot库以及Graphviz,并配置好环境变量,才可以使用。

模型编译与训练

模型编译中需要的设置的参数包括损失函数(交叉熵损失函数),优化器(Adam),以及评价指标(accuracy),模型训练使用model.fit()函数,先输入训练的图像(x_train)及其标签值(y_train),一次性输入网络的数量(batch_size),训练的轮数(epochs),以及分割的测试集,最后用model.save()来保存训练好的模型,与以往不同的一点是保存文件的后缀由.h5改为了.keras。

# 模型编译
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics='accuracy')
# 模型训练
history = model.fit(x_train,y_train,batch_size=200,epochs=50,verbose=1,validation_data=(x_test ,y_test))
model.save("my_model_100.keras")

后处理以及模型评估

后处理以图像的形式展示模型训练的结果,以下是绘制损失曲线与准确率曲线的代码。

# 绘制损失函数曲线
plt.figure()
plt.plot(history.history["loss"],label="train_loss" )
plt.plot(history.history["val_loss"],label="val_loss")
plt.legend()
plt.grid()
plt.show()
#绘制准确率图像
plt.figure()
plt.plot(history.history["accuracy"],label="accuracy")
plt.plot(history.history["val_accuracy"],label="val_accuracy")
plt.legend()
plt.grid()
plt.show()

 

图3 损失函数曲线

 

图4 准确率曲线

 模型评估使用model.evaluate()函数,图5为评估结果输出。

score=model.evaluate(x_test,y_test,verbose=1)

 

 图5 模型评估结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JIA.L.

你的鼓励是我创作的最大动力!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值