赞
踩
本项目是基于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 模型评估结果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。