1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Keras : 训练minst数据集并加载模型对本地手写图片进行预测

Keras : 训练minst数据集并加载模型对本地手写图片进行预测

时间:2021-08-21 07:46:12

相关推荐

Keras : 训练minst数据集并加载模型对本地手写图片进行预测

我是本期目录酱

引入minst数据集介绍训练模型与测试的py代码分析训练及测试的py代码(全)训练及测试结果分析加载模型并预测本地图片结果加载模型并预测本地图片py代码(不全)加载模型并预测本地图片结果ending彩蛋

引入

ldw老师课上提供minst数据集(就是这个文件:MNIST.npz)和写好的py代码,运行即可得到在本地的训练集。

在这之前,先讲一些概念,引入一下)

minst数据集介绍

首先,minst是啥,数据集,怎么样的,手写图片,黑底白字,如图(大概就是这样了)

训练模型与测试的py代码分析

接着讲下训练的思路,数据集里面一共有70000个数据,通俗讲就是上面的手写数字,然后呢,我们的代码里面把它分成俩部分,60000个放在训练集里面,剩下10000放在测试集(总不能全用来训练不进行测试吧,这样不好不好)。

所以代码的第一个部分就是要进行数据的预处理,将训练集和测试集的数据分别存好,这里需要说明一下,一个数据除了要保存他的图片,还需要保存他的类型。比如图像的数字矩阵对应的是他是那个数字,这样就构成了x和y的关系,也就确定了我们的训练目标嗯。这里需要知道的前提就是数据集里的手写数字规定大小是28 * 28 * 1,这就是为什么reshape的时候后面规定的大小是784的原因(同时为后面加载模型后对手写图片进行预测的话要转成灰度图像埋下伏笔嗯)

全部处理完成之后下一步就是要构建训练模型。讲训练模型之前先要知道的是深度学习这个输入和输出,然后中间是隐藏层的有个图示(偷一下ppt上的图),隐藏层里面的原理暂时还不是很明白,只需要知道是类似于神经元然后将数据进行传输,之后得到一个能把x和y对应起来的训练结果就行(我讲清楚没)。

okay接下来就根据这个图,可以知道我们需要给模型设定的最基本的东西就是三个部分,输入层,中间的隐藏层们,输出层,然后给出定义:

激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。

常用的激活函数有relu(隐层神经元输出)、sigmoid(回归问题)、softmax(多分类n选一问题)这几个。激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

Loss函数,机器学习中的监督学习本质上是给定一系列训练样本(xi,yi),尝试学习x->y的映射关系,使得给定一个x,即便这个x不在训练样本中,也能够输出y’,尽量与真实的y接近。损失函数是用来估量模型的输出y’与真实值y之间的差距,给模型的优化指引方向。模型的结构风险包括了经验风险和结构风险,损失函数是经验风险函数的核心部分,可以自己按需求构造。回归问题主要用的是MSE(mean squared error),分类问题常用交叉熵(cross entropy)。详情介绍请看:指路Loss函数

Optimizer优化器,所谓的优化器,就是tensorflow中梯度下降的策略,用于更新神经网络中数以百万的参数。课上讲到了俩种,一是SGD,比较稳定但是运行起来比较慢,二是Adam/Nadam,用的人比较多,速度也快很多,但是有时会出现问题,据说收敛不是很准确。详细介绍可以看这俩篇:优化器指路1优化器指路2

其实看图差不多就是这样👇

训练及测试的py代码(全)

接着看代码

import cv2# 下面俩行是我当时CPU不够尝试的方法,后面充电跑了一下发现不报错了就直接注释掉了嗯# import os# os.environ["CUDA_VISIBLE_DEVICES"]="-1"import numpy as npimport tensorflow as tf#import kerasfrom tensorflow import keras#from keras import layersfrom tensorflow.keras import layersdef load_mnist(): #读取离线的MNIST.npz文件。path = r'mnist.npz' #放置mnist.py的目录,这里默认跟本代码在同一个文件夹之下。f = np.load(path)x_train, y_train = f['x_train'], f['y_train']x_test, y_test = f['x_test'], f['y_test']f.close()return (x_train, y_train), (x_test, y_test)(train_image,train_label),(test_image,test_label) = load_mnist()print(train_image.shape)print(train_label.shape)#将image映射为784维向量,并映射为[0,1]之间的浮点数train_image = train_image.reshape([60000,784])test_image = test_image.reshape([10000,784])train_image = train_image.astype("float32") / 255test_image = test_image.astype("float32") / 255#将label映射为one-hot-key的形式num_classes = 10train_label = keras.utils.to_categorical(train_label, num_classes)test_label = keras.utils.to_categorical(test_label, num_classes)print(type(train_image),type(train_label))# #构建模型model = keras.Sequential([keras.Input(shape=(784,)), #这里(784,)的意思是784维向量构成的batch,省略的是batch的大小layers.Dense(20, activation="relu"),layers.Dense(20, activation="relu"),#layers.Dense(10, activation="relu"),layers.Dense(num_classes, activation="softmax"),])model.summary()#模型训练和测试pile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs")model.fit(x=train_image, y=train_label, batch_size=32, epochs=10, validation_data=(test_image, test_label), verbose=2, callbacks=[tensorboard_callback])score = model.evaluate(test_image, test_label, verbose=0)print("Test loss:", score[0])print("Test accuracy:", score[1])model.save('model.h5')

训练及测试结果分析

运行MNIST_ANN.py文件(要在keras第三方库可运行的情况下,将mnist.npz数据集放置在同一目录下),生成model.h5模型并存储在同级目录中。同时可以看到logs日志文件夹,win+r快捷键打开cmd命令行输入tensorboard --logdir=F:/xx命令可启动Tensorboard,在http://localhost:6006/中可查看相关信息,例如显示程序执行步骤以及统计训练参数(loss值等)。(Tensorboard在这就不介绍了,很好用,但是这里的代码比较简单,没必要,打开看看效果还是可以的嗯,附图Tensorboard查看程序执行步骤以及以及训练参数)

加载模型并预测本地图片结果

接下来正文开始

使用画图手写数字并保存图片,图片大小随意(但如果不是28倍数的话,在程序中需要增加resize操作),图片底色随意(根据个人不完全实验,并无过大影响,附自己测试用的手写图片集合)。

准备好图片之后将py程序分解成以下3部分:

加载模型

model = tf.keras.models.load_model("model.h5")

加载待预测的数据

def load_data():return data

通过模型预测并输出结果

predict = model.predict(pre_x)

接下来按照这个步骤来写就行,读取图片的话可以有很多方式,用你最习惯的就行,我用的cv2,主要只听说过这个,老师用的是pil,好像比较常用的样子嗯。

加载模型并预测本地图片py代码(不全)

# -*- coding: utf-8 -*-# @TIME: /9/25 9:31# @Author : Chen Shan# @Email : 879115657@# @File: homework01.py# @Software : PyCharmimport tensorflow as tfimport cv2import numpy as np# 加载模型model = tf.keras.models.load_model("model.h5")# 加载待预测数据def load_data():pre_x = []path = r'这里自己改一下路径嗯'img = cv2.imread(path)# 格式化图片放到img_arr变量里面pre_x.append(img_arr)return pre_xpre_x = load_data()# 通过模型预测结果并输出predict = model.predict(pre_x)# print(predict)#获取最大值输出predict = np.argmax(predict)print("The result of model recognition is: "+str(predict))

加载模型并预测本地图片结果

截图讲话,恩就这。

ending彩蛋

遇到的问题和神神叨叨

没错我的头像真好看~白白(下星期见oh

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。