tensorflow开发之 基于softmax的手写数字识别(含源码)


点击查看 (人工智能) 系列文章


训练过程

定义神经网络

在这里插入图片描述

模型训练

在这里插入图片描述

可视化训练结果

在这里插入图片描述

模型存储

在这里插入图片描述
在这里插入图片描述

模型加载

在这里插入图片描述

模型使用

在这里插入图片描述

源码

# 读取数据
import tensorflow as tf

mnist = tf.keras.datasets.mnist
(imgTrain, labelTrain),(imgTest, labelTest) = mnist.load_data(path='mnist.npz')
# 将2维矩阵变为1维向量
print('source data structure')
print(imgTrain.shape, type(imgTrain))
print(imgTest.shape, type(imgTest))

imgTrain = imgTrain.reshape(60000, 784)
imgTest = imgTest.reshape(10000, 784)

print('data structure after reshape')
print(imgTrain.shape, type(imgTrain))
print(imgTest.shape, type(imgTest))

# 数据归一化处理
imgTrain = imgTrain.astype('float32')
imgTest = imgTest.astype('float32')
imgTrain /= 255
imgTest /= 255
# 数据编码为one-hot
from keras.utils import np_utils

n_classes = 10
rstTrain = np_utils.to_categorical(labelTrain, n_classes)
rstTest = np_utils.to_categorical(labelTest, n_classes)

print(rstTrain[0], rstTrain.shape)
print(labelTrain[0], labelTrain.shape)
# 定义神经网络(数据流图)
from keras.models import Sequential
from keras.layers.core import Dense, Activation

# 第一层隐藏层
model = Sequential()
model.add(Dense(512, input_shape = (784,)))
model.add(Activation('relu'))

# 第二层隐藏层(上一层输出作为本层输入)
model.add(Dense(512))
model.add(Activation('relu'))

#最后一层输出层为10个数值
model.add(Dense(10))
model.add(Activation('softmax'))
# 编译模型
# compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
# 模型训练
#fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

history = model.fit(imgTrain, rstTrain, batch_size=128, epochs=5, verbose=2, validation_data=(imgTest, rstTest))
# 可视化展示训练过程
import matplotlib.pyplot as plt
fig = plt.figure()
# 展示模型训练过程精度变化
plt.subplot(2, 1, 1)
plt.plot(history.history['accuracy']) # 训练准确率
plt.plot(history.history['val_accuracy']) #测试集上的准确率
plt.title('Model Accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend(['train', 'test'], loc='lower right')
# 展示损失值变化
plt.subplot(2, 1, 2)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'test'], loc='upper right')
plt.tight_layout()
plt.show()
# 模型存储
# model.save(filepath),存储模型为一个独立的HDF5文件
# 其中含有模型训练结果、模型自身、配置参数以及用于恢复训练的优化器等
import os

modelName = ".\model\kerasMnist.h5"
if os.path.exists(modelName):
    os.remove(modelName)    
model.save(modelName)
print('save the trained model in %s'% modelName)
# 加载模型
# keras.models.load_model(filepath)
from keras.models import load_model

mnistModel = load_model(modelName)
# 模型在测试集上的结果评估
import numpy as np
lossMetrics = mnistModel.evaluate(imgTest, rstTest, verbose = 2)
print("测试数据最终损失值:{}".format(lossMetrics[0]))
print("测试数据精度:{}".format(lossMetrics[1] * 100))

# 模型对测试集进行预测
rstPredict = mnistModel.predict(imgTest)
rstPredict = np.argmax(rstPredict,axis=1)
correctDatas = np.nonzero(rstPredict == labelTest)[0]
wrongDatas = np.nonzero(rstPredict != labelTest)[0]
print("预测正确个数:{}".format(len(correctDatas)))
print("预测错误个数:{}".format(len(wrongDatas)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

放羊郎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值